Mysql 中 MyISAM 和 InnoDB 的區別

熱乾麵的日常學習發表於2020-11-16

一、區別

  1. InnoDB 支援事務,MyISAM 不支援事務。這是 MySQL 將預設儲存引擎從 MyISAM 變成 InnoDB 的重要原因之一;
  2. InnoDB 支援外來鍵,而 MyISAM 不支援。對一個包含外來鍵的 InnoDB 錶轉為 MYISAM 會失敗;
  3. InnoDB 不儲存表的具體行數,執行 select count(*) from table 時需要全表掃描。而MyISAM 用一個變數儲存了整個表的行數,執行上述語句時只需要讀出該變數即可,速度很快;
  4. InnoDB 最小的鎖粒度是行鎖,MyISAM 最小的鎖粒度是表鎖。一個更新語句會鎖住整張表,導致其他查詢和更新都會被阻塞,因此併發訪問受限。這也是 MySQL 將預設儲存引擎從 MyISAM 變成 InnoDB 的重要原因之一;
  5. InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的檔案存放在主鍵索引的葉子節點上,因此 InnoDB 必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然後再通過主鍵查詢到資料。因此,主鍵不應該過大,因為主鍵太大,其他索引也都會很大。而 MyISAM 是非聚集索引,資料檔案是分離的,索引儲存的是資料檔案的指標。主鍵索引和輔助索引是獨立的。

二、如何選擇儲存引擎

  1. 是否要支援事務,如果要請選擇 InnoDB,如果不需要可以考慮 MyISAM;
  2. 如果表中絕大多數都只是讀查詢,可以考慮 MyISAM,如果既有讀寫也挺頻繁,請使用InnoDB。
  3. 系統奔潰後,MyISAM恢復起來更困難,能否接受,不能接受就選 InnoDB;
  4. MySQL5.5版本開始Innodb已經成為Mysql的預設引擎(之前是MyISAM),說明其優勢是有目共睹的。如果你不知道用什麼儲存引擎,那就用InnoDB,至少不會差。

三、InnoDB的索引原理

索引就像一本書的目錄。而當使用者通過索引查詢資料時,就好比使用者通過目錄查詢某章節的某個知識點。這樣就幫助使用者有效地提高了查詢速度。所以,使用索引可以有效地提高資料庫系統的整體效能。

  1. 索引分為聚簇索引和非聚簇索引
    非聚簇索引:複合索引、字首索引、唯一索引,又將其稱為輔助索引(secondary index),其資料結構為B+樹。
    聚簇索引:在Mysql中是沒有語句來另外生成的,在Innodb中,Mysql中的資料是按照主鍵的順序來存放的。那麼聚簇索引就是按照每張表的主鍵來構造一顆B+樹,葉子節點存放的就是整張表的行資料。由於表裡的資料只能按照一顆B+樹排序,因此一張表只能有一個聚簇索引。在Innodb中,聚簇索引預設就是主鍵索引。
    在這裡插入圖片描述

相關文章