MySQL中索引是在存儲引擎層實作的,
執行查詢引擎的指令show engines,就可以看到MySQL支援的存儲引擎結果.
mysql支援存儲引擎有好幾種,咱們這裡主要讨論一下常用的Innodb,MyISAM存儲引擎。
1. InnoDB存儲引擎
1.1 InnoDB特點
- InnoDB存儲引擎提供了具有送出、復原和崩潰恢複能力的事務安全。相比較MyISAM存儲引擎,InnoDB寫的處理效率差一點并且會占用更多的磁盤空間保留資料和索引。
- 提供了對資料庫事務ACID(原子性Atomicity、一緻性Consistency、隔離性Isolation、持久性Durability)的支援,實作了SQL标準的四種隔離級别。
- 設計目标就是處理大容量的資料庫系統,MySQL運作時InnoDB會在記憶體中建立緩沖池,用于緩沖資料和索引。
- 執行“select count(*) from table”語句時需要掃描全表,因為使用innodb引擎的表不會儲存表的具體行數,是以需要掃描整個表才能計算多少行。
- InnoDB引擎是行鎖,粒度更小,是以寫操作不會鎖定全表,在并發較高時,使用InnoDB會提升效率。即存在大量UPDATE/INSERT操作時,效率較高。
- InnoDB清空資料量大的表時,是非常緩慢,這是因為InnoDB必須處理表中的每一行,根據InnoDB的事務設計原則,首先需要把“删除動作”寫入“事務日志”,然後寫入實際的表。是以,清空大表的時候,最好直接drop table然後重建。即InnoDB一行一行删除,不會重建表。
1.2 使用場景:
- 經常UPDETE/INSERT的表,使用處理多并發的寫請求
- 支援事務,必選InnoDB。
- 可以從災難中恢複(日志+事務復原)
- 外鍵限制、列屬性AUTO_INCREMENT支援
2. MyISAM存儲引擎
2.1 特點:
- MyISAM不支援事務,不支援外鍵,SELECT/INSERT為主的應用可以使用該引擎。
- 每個MyISAM在存儲成3個檔案,擴充名分别是:
- frm:存儲表定義(表結構等資訊)
- MYD(MYData),存儲資料
- MYI(MYIndex),存儲索引
- 不同MyISAM表的索引檔案和資料檔案可以放置到不同的路徑下。
- MyISAM類型的表提供修複的工具,可以用CHECK TABLE語句來檢查MyISAM表健康,并用REPAIR TABLE語句修複一個損壞的MyISAM表。
- 在MySQL5.6以前,隻有MyISAM支援Full-text全文索引
2.2 使用場景:
- 經常SELECT/INSERT的表,插入不頻繁,查詢非常頻繁
- 不支援事務
- 做很多count 的計算。
3. MyISAM和Innodb差別
InnoDB和MyISAM是許多人在使用MySQL時最常用的兩個存儲引擎,這兩個存儲引擎各有優劣,視具體應用而定。基本的差别為:MyISAM類型不支援事務處理,而InnoDB類型支援。MyISAM類型強調的是性能,其執行速度比InnoDB類型更快,而InnoDB提供事務支援以及外鍵等進階資料庫功能。
- 具體實作的差别:
- MyISAM是非事務安全型的,而InnoDB是事務安全型的。
- MyISAM鎖的粒度是表級,而InnoDB支援行級鎖定。
- MyISAM不支援外鍵,而InnoDB支援外鍵
- MyISAM相對簡單,是以在效率上要優于InnoDB,小型應用可以考慮使用MyISAM。
- InnoDB表比MyISAM表更安全。