MySQL資料庫之MyISAM與InnoDB的區別

2021-08-25 05:39:41 字數 2876 閱讀 4965

從以下幾個方面:

1、儲存結構 

每個myisam在磁碟上儲存成三個檔案。第乙個檔案的名字以表的名字開始,副檔名指出檔案型別。 

.frm檔案儲存表定義。 

資料檔案的擴充套件名為.myd (mydata)。 

索引檔案的副檔名是.myi (myindex)。

2、儲存空間 

myisam:可被壓縮,儲存空間較小。 

innodb:需要更多的記憶體和儲存,它會在主記憶體中建立其專用的緩衝池用於高速緩衝資料和索引。 

myisam的索引和資料是分開的,並且索引是有壓縮的,記憶體使用率就對應提高了不少。能載入更多索引,而innodb是索引和資料是緊密**的,沒有使用壓縮從而會造成innodb比myisam體積龐大不小

3、事務處理 

myisam型別的表強調的是效能,其執行數度比innodb型別更快,但是不支援外來鍵、不提供事務支援。 

innodb提供事務支援事務,外部鍵(foreign key)等高階資料庫功能。

select、update、insert、delete操作 

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

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

delete from table時,innodb不會重新建立表,而是一行一行的刪除。而myisam則是重新建立表。在innodb上如果要清空儲存有大量資料的表,最好使用truncate table這個命令。

auto_increment 

myisam:可以和其他字段一起建立聯合索引。引擎的自動增長列必須是索引,如果是組合索引,自動增長可以不是第一列,他可以根據前面幾列進行排序後遞增。 

innodb:innodb中必須包含只有該字段的索引。引擎的自動增長列必須是索引,如果是組合索引也必須是組合索引的第一列。

4、表的具體行數 

myisam:儲存有表的總行數,如果select count(*) from table;會直接取出該值。 

innodb:沒有儲存表的總行數,如果使用select count(*) from table;就會遍歷整個表,消耗相當大,但是在加了where後,myisam和innodb處理的方式都一樣。

5、全文索引 

myisam:支援 fulltext型別的全文索引。不支援中文。 

innodb:不支援fulltext型別的全文索引,但是innodb可以使用sphinx外掛程式支援全文索引,並且效果更好。

6、表鎖差異 

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

innodb:支援事務和行級鎖,是innodb的最大特色。行鎖大幅度提高了多使用者併發操作的新能。但是innodb的行鎖也不是絕對的,如果在執行乙個sql語句時mysql不能確定要掃瞄的範圍,innodb表同樣會鎖全表, 例如update table set num=1 where name like 「%aaa%」

一般來說: 

myisam適合: 

(1)做很多count 的計算; 

(2)插入不頻繁,查詢非常頻繁; 

(3)沒有事務。 

innodb適合: 

(1)可靠性要求比較高,或者要求事務; 

(2)表更新和查詢都相當的頻繁,並且表鎖定的機會比較大的情況。

兩種型別最主要的差別就是innodb 支援事務處理與外來鍵和行級鎖。而myisam不支援.所以myisam往往就容易被人認為只適合在小專案中使用。

作為使用mysql的使用者角度出發,innodb和myisam都是比較喜歡的,如果資料庫平台要達到需求:99.9%的穩定性,方便的擴充套件性和高可用性來說的話,myisam絕對是首選。

原因如下:

1、平台上承載的大部分專案是讀多寫少的專案,而myisam的讀效能是比innodb強不少的。

2、myisam的索引和資料是分開的,並且索引是有壓縮的,記憶體使用率就對應提高了不少。能載入更多索引,而innodb是索引和資料是緊密**的,沒有使用壓縮從而會造成innodb比myisam體積龐大不小。

3、經常隔1,2個月就會發生應用開發人員不小心update乙個表where寫的範圍不對,導致這個表沒法正常用了,這個時候myisam的優越性就體現出來了,隨便從當天拷貝的壓縮包取出對應表的檔案,隨便放到乙個資料庫目錄下,然後dump成sql再導回到主庫,並把對應的binlog補上。如果是innodb,恐怕不可能有這麼快速度,別和我說讓innodb定期用匯出***.sql機制備份,因為最小的乙個資料庫例項的資料量基本都是幾十g大小。

4、從接觸的應用邏輯來說,select count(*) 和order by 是最頻繁的,大概能佔了整個sql總語句的60%以上的操作,而這種操作innodb其實也是會鎖表的,很多人以為innodb是行級鎖,那個只是where對它主鍵是有效,非主鍵的都會鎖全表的。

5、還有就是經常有很多應用部門需要我給他們定期某些表的資料,myisam的話很方便,只要發給他們對應那錶的frm.myd,myi的檔案,讓他們自己在對應版本的資料庫啟動就行,而innodb就需要匯出***.sql了,因為光給別人檔案,受字典資料檔案的影響,對方是無法使用的。

6、如果和myisam比insert寫操作的話,innodb還達不到myisam的寫效能,如果是針對基於索引的update操作,雖然myisam可能會遜色innodb,但是那麼高併發的寫,從庫能否追的上也是乙個問題,還不如通過多例項分庫分表架構來解決。

7、如果是用myisam的話,merge引擎可以大大加快應用部門的開發速度,他們只要對這個merge表做一些select count(*)操作,非常適合大專案總量約幾億的rows某一型別(如日誌,調查統計)的業務表。

當然innodb也不是絕對不用,用事務的專案就用innodb的。另外,可能有人會說你myisam無法抗太多寫操作,但是可以通過架構來彌補。

MySQL資料庫表修復 MyISAM

一 mysql中myisam表損壞原因總結 1 伺服器突然斷電導致資料檔案損壞 強制關機,沒有先關閉mysql 服務 mysqld 程序在寫表時被殺掉。2 磁碟損壞。3 伺服器宕機。4 mysql 本身的bug 二 mysql中myisam表損壞的症狀總結 1 查詢資料時報出錯誤 incorrect...

mysql資料庫引擎 MyISAM和InnoDB

mysql 優化系列 一 mysql資料庫引擎效能測試 mysql 資料庫中,最常用的兩種引擎是innordb和myisam。innordb的功能要比myiasm強大很多,但是innordb的效能要比myisam差很多,如果你的 只是做簡單的查詢,更新,刪除,那麼用myiasm是最好的選擇。所有的效...

MySQL資料庫中myisam與innodb的區別

1 myisam是非事務安全型的,而innodb是事務安全型 2 myisam是鎖支援到表級,而innodb支援行級。3 myisam支援全文檢索,而innodb不支援全文檢索 4 myisam表儲存為檔案形式的,有利於跨平台時進行資料轉移,而innodb比myisam更安全,可以保證表中資料不丟失...