搞定技術面試:存儲引擎(ENGINE)

MySQL 有多種存儲引擎,目前常用的是 MyISAM 和 InnoDB 這兩個引擎,除了這兩個引擎以爲還有許多其他引擎,有官方的,也有一些公司自己研發的。

1.MyISAM

(1)索引類型:MyISAM 是 MySQL 5.5.5 之前的默認引擎,它支持B-tree/FullText/R-tree 索引類型,,其優勢是訪問的速度快,對事務完整性沒有要求或者以SELECT、INSERT 爲主的應用基本上都可以使用這個引擎來創建表。

(2)自動增長列:自動增長列可以是組合索引的其他列,這樣插入記錄後,自動增長列是按照組合索引的前面幾列進行排序後遞增的。

(3)鎖級別:表鎖,表鎖優點是開銷小,加鎖快;缺點是鎖粒度大,發生鎖衝動概率較高,容納併發能力低,這個引擎適合查詢爲主的業務。

(4)事務和外鍵:此引擎不支持事務,也不支持外鍵。

(5)讀取性能:MyISAM強調了快速讀取操作。它存儲表的行數,於是SELECT COUNT(*) FROM TABLE時只需要直接讀取已經保存好的值而不需要進行全表掃描。

2.InnoDB

(1)索引類型:InnoDB 存儲引擎最大的亮點就是支持事務、回滾和崩潰恢復。對比MyISAM的存儲引擎,InnoDB寫的效率差一些並且會佔用更多的磁盤空間以保留數據和索引。它支持 Hash/B-tree 索引類型。

(2)自動增長列:自動增長列必須是索引。如果是組合索引,也必須是組合索引的第一列。InnoDB 表的自動增長列可以手工插入,但是插入的值如果是空或者0,則實際插入的將是自動增長後的值。

(3)鎖級別:行鎖,行鎖優點是適用於高併發的頻繁表修改,高併發是性能優於 MyISAM。缺點是系統消耗較大,索引不僅緩存自身,也緩存數據,相比 MyISAM 需要更大的內存。

(4)事務和外鍵:支持事務,支持外鍵。在創建外鍵的時候,要求父表必須有對應的索引,子表在創建外鍵的時候也會自動創建對應的索引。當某個表被其他表創建了外鍵參照,那麼該表的對應索引或者主鍵禁止被刪除。

(5)讀取性能:InnoDB 中不保存表的具體行數,也就是說,執行 select count(*) from table時,InnoDB 要掃描一遍整個表來計算有多少行。

3.MyIsAM和InnoDB的比較

比較項 MyIsAm InnoDB
存儲結構 每張表被存放在三個文件:frm-格定義MYD(MYData)-數據文件MYI(MYIndex)-索引文件 所有的表都保存在同一個數據文件中(也可能是多個文件,或者是獨立的表空間文件),InnoDB表的大小隻受限於操作系統文件的大小,一般爲2GB
存儲空間 MyISAM可被壓縮,存儲空間較小 InnoDB的表需要更多的內存和存儲,它會在主內存中建立其專用的緩衝池用於高速緩衝數據和索引
可移植性、備份及恢復 由於MyISAM的數據是以文件的形式存儲,所以在跨平臺的數據轉移中會很方便。在備份和恢復時可單獨針對某個表進行操作 免費的方案可以是拷貝數據文件、備份 binlog,或者用 mysqldump,在數據量達到幾十G的時候就相對痛苦了
事務安全 不支持,每次查詢具有原子性 支持具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表
AUTO_INCREMENT MyISAM表可以和其他字段一起建立聯合索引 InnoDB中必須包含只有該字段的索引
SELECT MyISAM更優
INSERT InnoDB更優
UPDATE InnoDB更優
DELETE InnoDB更優 它不會重新建立表,而是一行一行的刪除
COUNT without WHERE MyISAM更優。因爲MyISAM保存了表的具體行數 InnoDB沒有保存表的具體行數,需要逐行掃描統計,就很慢了
只支持表鎖 支持表鎖、行鎖。行鎖大幅度提高了多用戶併發操作的新能。但是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會鎖全表的
外鍵 不支持 支持
索引 支持 不支持(5.6.4以上支持英文全文索引)可以通過使用Sphinx從InnoDB中獲得全文索引,會慢一點

4.如何選擇存儲引擎

(1)MyIsAM:如果應用是以讀操作和插入操作爲主,只有很少的更新和刪除操作,並且對事務的完整性、併發性要求不是很高,那麼選擇這個存儲引擎是非常適合的。MyISAM 是在Web、數據倉儲和其他應用環境下最常使用的存儲引擎之一。

(2)InnoDB:用於事務處理應用程序,支持外鍵。如果應用對事務的完整性有比較高的要求,在併發條件下要求數據的一致性,數據操作除了插入和查詢以外,還包括很多的更新、刪除操作,那麼InnoDB 存儲引擎應該是比較合適的選擇。InnoDB 存儲引擎除了有效地降低由於刪除和更新導致的鎖定,還可以確保事務的完整提交(Commit)和回滾(Rollback),對於類似計費系統或者財務系統等對數據準確性要求比較高的系統,InnoDB 都是合適的選擇。

(3)互聯網項目中隨着硬件成本的降低及緩存、中間件的應用,一般我們選擇都以 InnoDB 存儲引擎爲主,很少再去選擇 MyISAM 了。而業務真發展的一定程度時,自帶的存儲引擎無法滿足時,這時公司應該是有實力去自主研發滿足自己需求的存儲引擎或者購買商用的存儲引擎了。

掘金 進擊的小嘍囉 同步發佈

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