兩種常見數據庫引擎:MyISAM 與 InnoDB 的區別

1.事務的支持

  • MyISAM:強調的是性能,每次查詢具有原子性,其執行數度比 InnoDB 類型更快,但是不提供事務支持。

  • InnoDB:提供事務支持事務,外部鍵等高級數據庫功能。具有事務 (commit)、回滾 (rollback) 和崩潰修復能力 (crash recovery capabilities) 的事務安全 (transaction-safe (ACID compliant)) 型表。

2.底層結構

  • InnoDB 是聚集索引,使用 B+Tree 作爲索引結構數據文件是和(主鍵)索引綁在一起的(表數據文件本身就是按 B+Tree 組織的一個索引結構),必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然後再通過主鍵查詢到數據。因此,主鍵不應該過大,因爲主鍵太大,其他索引也都會很大。

  • MyISAM 是非聚集索引,也是使用 B+Tree 作爲索引結構,索引和數據文件是分離的,索引保存的是數據文件的指針。主鍵索引和輔助索引是獨立的。

  • 也就是說:InnoDB 的 B + 樹主鍵索引的葉子節點就是數據文件,輔助索引的葉子節點是主鍵的值;而 MyISAM 的 B + 樹主鍵索引和輔助索引的葉子節點都是數據文件的地址指針。

3.支持的鎖級別

  • MyISAM:只支持表級鎖,用戶在操作 MyISAM 表時,select,update,delete,insert 語句都會給表自動加鎖,如果加鎖以後的表滿足 insert 併發的情況下,可以在表的尾部插入新的數據。

  • InnoDB:支持事務和行級鎖,是 innodb 的最大特色。行鎖大幅度提高了多用戶併發操作的新能。但是 InnoDB 的行鎖,只是在 WHERE 的主鍵是有效的,非主鍵的 WHERE 都會鎖全表的

4.其他

  • InnoDB 支持外鍵,而 MyISAM 不支持。
  • Innodb 不支持全文索引,而 MyISAM 支持全文索引,在涉及全文索引領域的查詢效率上 MyISAM 速度更快高;PS:5.7 以後的 InnoDB 支持全文索引了

5.應用場景

  • MyISAM 適合查詢以及插入爲主的應用。如果你的應用程序對查詢性能要求較高,就要使用 MyISAM 了。MyISAM 的性能更優,佔用的存儲空間少

  • InnoDB 適合頻繁修改以及涉及到安全性較高的應用。如果你的應用程序一定要使用事務,毫無疑問你要選擇 INNODB 引擎。但要注意,INNODB 的行級鎖是有條件的。在 where 條件沒有使用主鍵時,照樣會鎖全表。比如 DELETE FROM mytable 這樣的刪除語句。

現在一般都是選用 innodb 了,主要是 MyISAM 的全表鎖,讀寫串行問題,併發效率鎖表,效率低,MyISAM 對於讀寫密集型應用一般是不會去選用的。

補充:

InnoDB 爲什麼推薦使用自增 ID 作爲主鍵?

  • 聚簇索引的底層數據結構是B+數, B + 的內部結點並沒有指向關鍵字具體信息的指針。因此其內部結點相對 B 樹更小。如果把所有同一內部結點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多。數據存放的更加緊密,具有更好的空間局部性。一次性讀入內存中的需要查找的關鍵字也就越多。同理,自增主鍵也要比其他主鍵的內容更少,存放的內容當然也更多。因此訪問葉子節點上關聯的數據也具有更好的緩存命中率。相對來說 IO 讀寫次數也就降低了。

  • 自增 ID 可以保證每次插入時 B + 索引是從右邊擴展的,可以避免 B + 樹和頻繁合併和分裂(對比使用 UUID)。如果使用字符串主鍵和隨機主鍵,會使得數據隨機插入,效率比較差。


【Java 面試那點事】

這裏致力於分享 Java 面試路上的各種知識,無論是技術還是經驗,你需要的這裏都有!

這裏可以讓你【快速瞭解 Java 相關知識】,並且【短時間在面試方面有跨越式提升】

面試路上,你不孤單!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章