MySQL中MyISAM與InnoDB區別及選擇

2021-08-28 13:45:24 字數 1721 閱讀 7111

innodb:

支援事務處理

不加鎖讀取

支援外來鍵

支援行鎖

不支援fulltext型別的索引

不儲存表的具體行數,掃瞄表來計算有多少行

delete 表時,是一行一行的刪除

innodb 把資料和索引存放在表空間裡面

跨平台可直接拷貝使用

innodb中必須包含auto_increment型別欄位的索引

**很難被壓縮

myisam:

不支援事務,回滾將造成不完全回滾,不具有原子性

不支援外來鍵

不支援外來鍵

支援全文搜尋

儲存表的具體行數,不帶where時,直接返回儲存的行數

delete 表時,先drop表,然後重建表

myisam 表被存放在三個檔案 。frm 檔案存放**定義。 資料檔案是myd (mydata) 。 索引檔案是myi (myindex)引伸

跨平台很難直接拷貝

myisam中可以使auto_increment型別字段建立聯合索引

**可以被壓縮

選擇:因為myisam相對簡單所以在效率上要優於innodb.如果系統讀多,寫少。對原子性要求低。那麼myisam最好的選擇。且myisam恢復速度快。可直接用備份覆蓋恢復。

如果系統讀少,寫多的時候,尤其是併發寫入高的時候。innodb就是首選了。

兩種型別都有自己優缺點,選擇那個完全要看自己的實際類弄。

1. 區別:

(1)事務處理:

myisam是非事務安全型的,而innodb是事務安全型的(支援事務處理等高階處理);

(2)鎖機制不同:

myisam是表級鎖,而innodb是行級鎖;

(3)select ,update ,insert ,delete 操作:

myisam:如果執行大量的select,myisam是更好的選擇

innodb:如果你的資料執行大量的insert或update,出於效能方面的考慮,應該使用innodb表

(4)查詢表的行數不同:

myisam:select count(*) from table,myisam只要簡單的讀出儲存好的行數,注意的是,當count(*)語句包含   where條件時,兩種表的操作是一樣的

innodb : innodb 中不儲存表的具體行數,也就是說,執行select count(*) from table時,innodb要掃瞄一遍整個表來計算有多少行

(5)外來鍵支援:

mysiam表不支援外來鍵,而innodb支援

2. 為什麼myisam會比innodb 的查詢速度快。

innodb在做select的時候,要維護的東西比myisam引擎多很多;

1)資料塊,innodb要快取,myisam只快取索引塊,  這中間還有換進換出的減少; 

2)innodb定址要對映到塊,再到行,myisam 記錄的直接是檔案的offset,定位比innodb要快

3)innodb還需要維護mvcc一致;雖然你的場景沒有,但他還是需要去檢查和維護

mvcc ( multi-version concurrency control )多版本併發控制 

3. 應用場景

myisam適合:(1)做很多count 的計算;(2)插入不頻繁,查詢非常頻繁;(3)沒有事務。

innodb適合:(1)可靠性要求比較高,或者要求事務;(2)表更新和查詢都相當的頻繁,並且行鎖定的機會比較大的情況。

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型別欄位的索引 很難...