Mysql兩種主要資料引擎的區別

liujieLike發表於2020-10-10

InnoDB和MyISAM是在使用MySQL最常用的兩個表型別,它們各有各的優點,視具體應用而定。

Innodb引擎(該引擎在5.5後的MySQL資料庫中為預設儲存引擎。)
Innodb引擎提供了對資料庫ACID事務的支援,並且實現了SQL標準的四種隔離級別。該引擎還提供了行級鎖和外來鍵約束,它的設計目標就是處理大容量資料庫系統,它本身其實就是基於MySQL後臺的完整的資料庫系統,MySQL執行時,Innodb會在記憶體中建立緩衝池,用於緩衝資料和索引。但是該引擎不支援FULLTEXT型別的索引,而且它啟動也比較慢,不會儲存表的行數,當執行SELECT COUNT(*) FROM TABLE指令時,需要掃描全表。當需要使用資料庫事務時,該引擎就是首選。由於鎖的粒度更小,寫操作不會鎖定全表,所以在併發較高的場景下,使用Innodb引擎會提升效率。但是使用行級鎖也不是絕對的,如果在執行一個SQL語句時MySQL不能確定要掃描的範圍,InnoDB表同樣會鎖全表。大容量的資料集時趨向於選擇Innodb。因為它支援事務處理和故障的恢復。Innodb可以利用資料日誌來進行資料的恢復。主鍵的查詢在Innodb也是比較快的。Innodb引擎的索引的資料結構是B+樹,只不過資料結構中儲存的都是實際的資料,這種索引有被稱為聚集索引。

MyIASM引擎(該引擎在5.5前的MySQL資料庫中為預設儲存引擎。)
MyISAM沒有提供對資料庫事務的支援,也不支援行級鎖和外來鍵。因此當執行INSERT插入或UPDATE更新語句時,即執行寫操作需要鎖定整個表,所以會導致效率降低。不過和Innodb不同的是,MyISAM引擎中儲存了表的行數,於是當執行SELECT COUNT(*) FROM TABLE時,可以直接讀取已經儲存好的值而不需要進行全表掃描。所以,如果表的讀操作遠遠多於寫操作,而且不需要資料庫事務的支援,可以將MyIASM作為資料庫引擎的首選。大批量的插入語句時(這裡是INSERT語句)在MyIASM引擎中執行的比較快,但是UPDATE語句在Innodb下執行的會比較快,尤其是在併發量大的時候。MyIASM引擎,B+樹的資料結構中儲存的內容實際上是實際資料的地址值。也就是說它的索引和實際資料是分開的,只不過使用索引指向了實際資料。這種索引的模式被稱為非聚集索引。

區別介紹
1、MyISAM是非事務安全的,而InnoDB是事務安全的
2、MyISAM鎖的粒度是表級的,而InnoDB支援行級鎖
3、MyISAM支援全文型別索引,而InnoDB不支援全文索引
4、MyISAM相對簡單,效率上要優於InnoDB,小型應用可以考慮使用MyISAM
5、MyISAM表儲存成檔案形式,跨平臺使用更加方便

使用場景:
1、MyISAM管理非事務表,提供高速儲存和檢索以及全文搜尋能力,如果在應用中執行大量select操作,應該選擇MyISAM
2、InnoDB用於事務處理,具有ACID事務支援等特性,如果在應用中執行大量insert和update操作,應該選擇InnoDB
3、大尺寸的資料集趨向於選擇InnoDB引擎,因為它支援事務處理和故障恢復。資料庫的大小決定了故障恢復的時間長短,InnoDB可以利用事務日誌進行資料恢復,這會比較快。主鍵查詢在InnoDB引擎下也會相當快,不過需要注意的是如果主鍵太長也會導致效能問題。

相關文章