1. 程式人生 > 其它 >Mysql 中 MyISAM 和 InnoDB 的區別有哪些?

Mysql 中 MyISAM 和 InnoDB 的區別有哪些?

Mysql中InnoDB與MyISAM兩種資料庫引擎的區別:

1、InnoDB 支援事務,MyISAM 不支援事務。對於InnoDB每一條SQL語言都預設封裝成事務,自動提交,這樣會影響速度,所以最好把多條SQL語言放在begin和commit之間,組成一個事務,這是 MySQL 將預設儲存引擎從 MyISAM 變成 InnoDB 的重要原因之一。

2、InnoDB 支援外來鍵,而 MyISAM 不支援。對一個包含外來鍵的 InnoDB 錶轉為 MYISAM 會失敗。

3、InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的檔案存放在主鍵索引的葉子節點上,因此 InnoDB 必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然後再通過主鍵查詢到資料。因此,主鍵不應該過大,因為主鍵太大,其他索引也都會很大。而 MyISAM 是非聚集索引,資料檔案是分離的,索引儲存的是資料檔案的指標。主鍵索引和輔助索引是獨立的。(也就是說:InnoDB的B+樹主鍵索引的葉子節點就是資料檔案,輔助索引的葉子節點是主鍵的值;而MyISAM的B+樹主鍵索引和輔助索引的葉子節點都是資料檔案的地址指標。)

4、InnoDB 不儲存表的具體行數,執行 select count(*) from table 時需要全表掃描。而MyISAM 用一個變數儲存了整個表的行數,執行上述語句時只需要讀出該變數即可,速度很快(注意不能加有任何WHERE條件)。

5、InnoDB 最小的鎖粒度是行鎖,MyISAM 最小的鎖粒度是表鎖。一個更新語句會鎖住整張表,導致其他查詢和更新都會被阻塞,因此併發訪問受限。這也是 MySQL 將預設儲存引擎從 MyISAM 變成 InnoDB 的重要原因之一。

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

7、MyISAM表格可以被壓縮後進行查詢操作。

8、InnoDB表必須有唯一索引(如主鍵)(使用者沒有指定的話會自己找/生產一個隱藏列Row_id來充當預設主鍵),而Myisam可以沒有

9、Innodb儲存檔案有frm、ibd,而Myisam是frm、MYD、MYI

  Innodb:frm是表定義檔案,ibd是資料檔案

  Myisam:frm是表定義檔案,myd是資料檔案,myi是索引檔案

如何選擇使用InnoDB與MyISAM

1、是否要支援事務,如果要請選擇 InnoDB,如果不需要可以考慮 MyISAM。

2、如果表中絕大多數都只是讀查詢,可以考慮 MyISAM,如果既有讀寫也挺頻繁,請使用InnoDB。

3、系統奔潰後,MyISAM恢復起來更困難,能否接受,不能接受就選 InnoDB。

4、MySQL5.5版本開始Innodb已經成為Mysql的預設引擎(之前是MyISAM),說明其優勢是有目共睹的。如果你不知道用什麼儲存引擎,那就用InnoDB,至少不會差。

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

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

InnoDB引擎的4大特性:

  插入緩衝(insert buffer),二次寫(double write),自適應雜湊索引(ahi),預讀(read ahead)

InnoDB與MyISAM詳細比較參照下表:

MyISAM InnoDB
構成上區別

每個MyISAM在磁碟上儲存成三個檔案。檔名為表名,副檔名為檔案型別。

.frm 檔案儲存表定義;
.MYD(MYData) 資料檔案的副檔名;
.MYI(MYIndex) 索引檔案的副檔名。
基於磁碟的資源是InnoDB表空間資料檔案和它的日誌檔案,InnoDB 表的大小隻受限於作業系統檔案的大小,一般為 2GB
事務處理方面 MyISAM型別的表強調的是效能,其執行速度比InnoDB型別更快,但是不提供事務支援。

InnoDB提供事務支援事務,外部鍵等高階資料庫功能。

表級鎖

行級鎖

InnoDB表的行鎖也不是絕對的,如果在執行一個SQL語句時MySQL不能確定要掃描的範圍,InnoDB表同樣會鎖全表,例如update table set num=1 where name like “%aaa%”

select、insert、update、delete操作 如果執行大量的 SELECT,MyISAM 是更好的選擇。

1.如果你的資料執行大量的INSERT或UPDATE,出於效能方面的考慮,應該使用InnoDB表。

2.DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除。

3.LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,匯入資料後再改成InnoDB表,但是對於使用的額外的InnoDB特性(例如外來鍵)的表不適用。

對於AUTO_INCREMENT型別的欄位 必須包含只有該欄位的索引 可以和其他欄位一起建立聯合索引
InnoDB不支援FULLTEXT型別的索引。
MyISAM型別的二進位制資料檔案可以在不同作業系統中遷移