mysql有多種儲存引擎,目前常用的是 MyISAM 和 InnoDB 這兩個引擎,除了這兩個引擎以為還有許多其他引擎,有官方的,也有一些公司自己研發的。這篇文章主要簡單概述一下常用常見的 MySQL 引擎,一則這是面試中常被問到的問題,二則這也是資料庫設計中不可忽略的問題,用合適的引擎可以更好的適應業務場景,提高業務效率。
MyISAM
MyISAM 是 mysql 5.5.5 之前的預設引擎,它支援 B-tree/FullText/R-tree 索引型別。
鎖級別為表鎖,表鎖優點是開銷小,加鎖快;缺點是鎖粒度大,發生鎖衝動概率較高,容納併發能力低,這個引擎適合查詢為主的業務。
此引擎不支援事務,也不支援外來鍵。
MyISAM強調了快速讀取操作。它儲存表的行數,於是SELECT COUNT(*) FROM TABLE時只需要直接讀取已經儲存好的值而不需要進行全表掃描。
InnoDB
InnoDB 儲存引擎最大的亮點就是支援事務,支援回滾,它支援 Hash/B-tree 索引型別。
鎖級別為行鎖,行鎖優點是適用於高併發的頻繁表修改,高併發是效能優於 MyISAM。缺點是系統消耗較大,索引不僅快取自身,也快取資料,相比 MyISAM 需要更大的記憶體。
InnoDB 中不儲存表的具體行數,也就是說,執行 select count(*) from table時,InnoDB 要掃描一遍整個表來計算有多少行。
支援事務,支援外來鍵。
ACID 事務
A 事務的原子性(Atomicity):指一個事務要麼全部執行,要麼不執行。也就是說一個事務不可能只執行了一半就停止了。比如你從取款機取錢,這個事務可以分成兩個步驟:1)劃卡,2)出錢。不可能劃了卡,而錢卻沒出來,這兩步必須同時完成,要麼就不完成。
C 事務的一致性(Consistency):指事務的執行並不改變資料庫中資料的一致性。例如,完整性約束了a+b=10,一個事務改變了a,那麼b也應該隨之改變。
I 獨立性(Isolation):事務的獨立性也有稱作隔離性,是指兩個以上的事務不會出現交錯執行的狀態。因為這樣可能會導致資料不一致。
D 永續性(Durability):事務的永續性是指事務執行成功以後,該事務所對資料庫所作的更改便是持久的儲存在資料庫之中,不會無緣無故的回滾。
Memory
Memory 是記憶體級別儲存引擎,資料儲存在記憶體中,所以他能夠儲存的資料量較小。
因為記憶體的特性,儲存引擎對資料的一致性支援較差。鎖級別為表鎖,不支援事務。但訪問速度非常快,並且預設使用 hash 索引。
Memory儲存引擎使用存在記憶體中的內容來建立表,每個Memory表只實際對應一個磁碟檔案,在磁碟中表現為.frm檔案。
總結
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沒有儲存表的具體行數,需要逐行掃描統計,就很慢了 |
COUNT with WHERE | 一樣 | 一樣,InnoDB也會鎖表 |
鎖 | 只支援表鎖 | 支援表鎖、行鎖 行鎖大幅度提高了多使用者併發操作的新能。但是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會鎖全表的 |
外來鍵 | 不支援 | 支援 |
FULLTEXT全文索引 | 支援 | 不支援(5.6.4以上支援英文全文索引) 可以通過使用Sphinx從InnoDB中獲得全文索引,會慢一點 |
網際網路專案中隨著硬體成本的降低及快取、中介軟體的應用,一般我們選擇都以 InnoDB 儲存引擎為主,很少再去選擇 MyISAM 了。而業務真發展的一定程度時,自帶的儲存引擎無法滿足時,這時公司應該是有實力去自主研發滿足自己需求的儲存引擎或者購買商用的儲存引擎了。