MyISAM與InnoDB 的區別

2022-08-17 05:51:16 字數 1275 閱讀 6826

1. 事務:innodb支援,myisam不支援,在innodb中每一條sql語句都會預設封裝成事務自動提交,然而這樣會影響速度,因此最好把多條sql語句放在begin和commit之間組成乙個事務;

2. 索引:innodb是聚集索引,使用b+tree作為索引結構,資料檔案是和(主鍵)索引綁在一起的(表資料檔案本身就是按b+tree組織的乙個索引結構),而輔助索引包含主鍵列(主索引)。

myisam是非聚集索引,也是使用b+tree作為索引結構,但索引和資料檔案是分離的,索引儲存的是資料檔案的指標,主鍵索引和輔助索引是獨立的。

3.全文索引:innodb不支援全文索引,而myisam支援全文索引,查詢效率上myisam要高;不過mysql在5.7版本以後,innodb支援全文索引了。

4.外來鍵:innodb支援外來鍵,而myisam不支援。

5.count()函式:innodb不儲存表的具體行數,執行select count(*) from table時需要全表掃瞄。而myisam用乙個變數儲存了整個表的行數,執行上述語句時只需要讀出該變數即可,速度很快;

6.主鍵:innodb表必須有主鍵(沒有指定的話引擎會自動尋找找或生產乙個主鍵),而myisam可以沒有。

7.儲存檔案型別:innodb

儲存檔案有frm、ibd,而myisam是frm、myd、myi

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

myd是資料檔案,myi是索引檔案

8.表鎖:myisam只支援表級鎖,使用者在操作myisam表時,select,update,delete,insert語句都會給表自動加鎖;

innodb支援表、行(預設)級鎖;

innodb的行鎖是實現在索引上的,而不是鎖在物理行記錄上,就是說如果訪問沒有命中索引的話是無法使用行鎖會退化為表鎖。

比如:有一張innodb表,t_user(id,name,age,address),id為pk  無其它索引

update t_user set age = 18 where id = 2 ;   命中索引,行鎖

update t_user set age = 20 where id != 6 ;   未命中索引,表鎖

update t_user set age = 21 where name = "jie" ;  無索引,表鎖

總結:

myisam不支援事務,而且不支援外來鍵,如果對資料庫表需要執行大量的 select 操作,myisam比較適合

innodb支援外來鍵、行鎖、事務是他的最大特點。如果有大量的 update 和 insert,建議使用innodb

MySQL中MyISAM與InnoDB區別

mysql中myisam與innodb區別 myisam innodb 事物處理 不支援支援 外來鍵不支援 支援行鎖 不支援支援 全文索引 支援不支援 表的具體行數 儲存表的具體行數 掃瞄表來計算行數 delete表時 先drop表,然後重建表 一行一行的刪除 索引和資料 分開的,並且索引是有壓縮的...

MySQL中MyISAM與InnoDB區別及選擇

innodb 支援事務處理等 不加鎖讀取 支援外來鍵 支援行鎖 不支援fulltext型別的索引 不儲存表的具體行數,掃瞄表來計算有多少行 delete 表時,是一行一行的刪除 innodb 把資料和索引存放在表空間裡面 跨平台可直接拷貝使用 innodb中必須包含auto increment型別欄...

MySQL中MyISAM與InnoDB區別及選擇

支援事務處理等 不加鎖讀取 支援外來鍵 支援行鎖 不支援fulltext型別的索引 不儲存表的具體行數,掃瞄表來計算有多少行 delete 表時,是一行一行的刪除 innodb 把資料和索引存放在表空間裡面 跨平台可直接拷貝使用 innodb中必須包含auto increment型別欄位的索引 很難...