MySQL
數據庫區別於其餘數據庫的很重要的一個特色就是其插件式的表存儲引擎,其基於表,而不是數據庫。因爲每一個存儲引擎都有其特色,所以咱們能夠針對每一張表來挑選最合適的存儲引擎。mysql
做爲DBA
,咱們應該深入的認識存儲引擎。今天介紹兩種最多見的存儲引擎和它們的區別:InnoDB
和MyISAM
。算法
InnoDB
存儲引擎InnoDB
存儲引擎支持事務,其設計目標主要就是面向OLTP(On Line Transaction Processing 在線事務處理)
的應用。特色爲行鎖設計、支持外鍵,並支持非鎖定讀。從5.5.8
版本開始,InnoDB
成爲了MySQL
的默認存儲引擎。sql
InnoDB
存儲引擎採用彙集索引(clustered)的方式來存儲數據,所以每一個表都是按照主鍵的順序進行存放,若是沒有指定主鍵,InnoDB
會爲每行自動生成一個6
字節的ROWID
做爲主鍵。數據庫
MyISAM
存儲引擎MyISAM
存儲引擎不支持事務、表鎖設計,支持全文索引,主要面向OLAP(On Line Analytical Processing 聯機分析處理)
應用,適用於數據倉庫等查詢頻繁的場景。在5.5.8
版本以前,MyISAM
是MySQL
的默認存儲引擎。該引擎表明着對海量數據進行查詢和分析的需求。它強調性能,所以在查詢的執行速度比InnoDB
更快。segmentfault
MyISAM
存儲引擎還有一個特色是隻緩存索引文件,而不緩存數據文件,這點很是獨特。緩存
InnoDB
和MyISAM
的區別爲了數據庫操做的原子性,咱們須要事務。保證一組操做要麼都成功,要麼都失敗,好比轉帳的功能。咱們一般將多條SQL
語句放在begin
和commit
之間,組成一個事務。安全
InnoDB
支持,MyISAM
不支持。併發
因爲InnoDB
的彙集索引,其若是沒有指定主鍵,就會自動生成主鍵。MyISAM
支持沒有主鍵的表存在。性能
爲了解決複雜邏輯的依賴,咱們須要外鍵。好比高考成績的錄入,必須歸屬於某位同窗,咱們就須要高考成績數據庫裏有準考證號的外鍵。優化
InnoDB
支持,MyISAM
不支持。
爲了優化查詢的速度,進行排序和匹配查找,咱們須要索引。好比全部人的姓名從a-z
首字母進行順序存儲,當咱們查找zhangsan
或者第44
位的時候就能夠很快的定位到咱們想要的位置進行查找。
InnoDB
是彙集索引,數據和主鍵的彙集索引綁定在一塊兒,經過主鍵索引效率很高。若是經過其餘列的輔助索引來進行查找,須要先查找到彙集索引,再查詢到全部數據,須要兩次查詢。
MyISAM
是非彙集索引,數據文件是分離的,索引保存的是數據的指針。
從InnoDB 1.2.x
版本,MySQL5.6
版本後,二者都支持全文索引。
auto_increment
對於自增數的字段,InnoDB
要求必須有隻有該字段的索引。但MyISAM
能夠將該字段與其餘字段組成聯合索引。
很常見的需求是看錶中有多少條數據,此時咱們須要select count(*) from table_name
。
InnoDB
不保存錶行數,須要進行全表掃描。MyISAM
用一個變量保存,直接讀取該值,更快。當時當帶有where
查詢的時候,二者同樣。
數據庫的文件都是須要在磁盤中進行存儲,當應用須要時再讀取到內存中。通常包含數據文件、索引文件。
InnoDB
分爲:
.frm
表結構文件.ibdata1
共享表空間.ibd
表獨佔空間.redo
日誌文件MyISAM
分爲三個文件:
.frm
存儲表定義.MYD
存儲表數據.MYI
存儲表索引若是你的操做是大量的查詢操做,如SELECT
,使用MyISAM
性能會更好。
若是大部分是刪除和更改的操做,使用InnoDB
。
delete
調用delete from table
時,MyISAM
會直接重建表,InnoDB
會一行一行的刪除,可是能夠用truncate table
代替。參考: mysql清空表數據的兩種方式和區別。
MyISAM
僅支持表鎖,每次操做鎖定整張表。InnoDB
支持行鎖,每次操做鎖住最小數量的行數據。
表鎖相比於行鎖消耗的資源更少,且不會出現死鎖,但同時併發性能差。行鎖消耗更多的資源,速度較慢,且可能發生死鎖,可是由於鎖定的粒度小、數據少,併發性能好。若是InnoDB
的一條語句沒法肯定要掃描的範圍,也會鎖定整張表。
當行鎖發生死鎖的時候,會計算每一個事務影響的行數,而後回滾行數較少的事務。
MyISAM
崩潰後沒法快速的安全恢復。InnoDB
有一套完善的恢復機制。
MyISAM
僅緩存索引數據,經過索引查詢數據。InnoDB
不只緩存索引數據,同時緩存數據信息,將數據按頁讀取到緩存池,按LRU(Latest Rare Use 最近最少使用)
算法來進行更新。
建立表的語句都是相同的,只有最後的type
來指定存儲引擎。
MyISAM
count
InnoDB