1、myisam不支援事務,innodb是事務型別的儲存引擎,當我們的表需要用到事務支援的時候,那肯定是不能選擇myisam了。
2、myisam只支援表級鎖,而innodb支援行級鎖和表級鎖預設為行級鎖
表級鎖:直接鎖定整張表,在鎖定期間,其他程序無法對該錶進行寫操作,如果設定的是寫鎖,那麼其他程序讀也不允許
myisam是表級鎖定的儲存引擎,它不會出現死鎖問題
對於write,表鎖定原理如下:
如果表上沒有鎖,在其上面放置乙個寫鎖,否則,把鎖定請求放在寫鎖佇列中。
對於read,表鎖定原理如下 :
如果表上沒有寫鎖定,那麼把乙個讀鎖放在其上面,否則把鎖請求放在讀鎖定佇列中
當乙個鎖定被釋放時,錶可被寫鎖定佇列中的執行緒得到,然後才是讀鎖定佇列中的執行緒。這意味著,如果你在乙個表上有許多更新,那麼你的select語句將等到所有的寫鎖定執行緒執行完。
行級鎖:只對指定的行進行鎖定,其他程序還是可以對錶中的其他行進行操作的。
行級鎖是mysql粒度最小的一種鎖,它能大大的減少資料庫操作的衝突,但是粒度越小實現成本也越大。
行級鎖可能會導致「死鎖」,那到底是怎麼導致的呢,分析原因:mysql行級鎖並不是直接鎖記錄,而是鎖索引。索引分為主鍵索引和非主鍵索引兩種,如果一條sql語句操作了主鍵索引,那麼mysql就會鎖定這個主鍵索引,如果sql語句操作的是非主鍵索引,那麼mysql會先鎖定這個非主鍵索引,再去鎖定主鍵索引。
在update 和 delete操作時mysql不僅會鎖定所有where 條件掃瞄過得索引,還會鎖定相鄰的鍵值。
「死鎖」舉例分析:
表test:(id
,state
,time) 主鍵索引:id 非主鍵索引:state
當執行"update state =1011 where state=1000" 語句的時候會鎖定state索引,由於state 是非主鍵索引,所以mysql還會去請求鎖定id索引
當另乙個sql語句與語句1幾乎同時執行時:「update
state
=1010
whereid=
1」 對於語句2 mysql會先鎖定id索引,由於語句2操作了state欄位,所以mysql還會請求鎖定state索引。這時。彼此鎖定著對方需要的索引,又都在等待對方釋放鎖定。所以出現了"死鎖"的情況。
行級鎖的優點:
有許多執行緒訪問不同的行時,只存在少量的衝突。
回滾時只有少量的更改
可以長時間鎖定單一的行
行級鎖缺點:
相對於頁級鎖和表級鎖來說占用了更多的記憶體
當表的大部分行在使用時,比頁級鎖和表級鎖慢,因為你必須獲得更多的鎖
當在大部分資料上經常使用group
by操作,肯定會比表級鎖和頁級鎖慢。
頁級鎖:表級鎖速度快,但是衝突多;行級鎖速度慢,但衝突少;頁級鎖就是他倆折中的,一次鎖定相鄰的一組記錄。
3、myisam引擎不支援外來鍵,innodb支援外來鍵
4、myisam引擎的表在大量高併發的讀寫下會經常出現表損壞的情況
我們以前做的專案就遇到這個問題,表的insert 和 update操作很頻繁,原來用的myisam引擎,導致表隔三差五就損壞,後來更換成了innodb引擎。
其他容易導致表損壞原因:
伺服器突然斷電導致資料檔案損壞,強制關機(mysqld未關閉情況下)導致表損壞
mysqld程序在寫入操作的時候被殺掉
磁碟故障
表損壞常見症狀:
查詢表不能返回資料或返回部分資料
開啟表失敗: can』t open file: 『×××.myi』 (errno:
145) 。
error: table 'p' is marked as crashed and should be repaired 。
incorrect key file for table:
'...'
. try to repair it
mysql表的恢復:
對於myisam表的恢復:
可以使用mysql自帶的myisamchk工具: myisamchk -r tablename 或者 myisamchk -o tablename(比前面的更保險) 對錶進行修復
5、對於count()查詢來說myisam更有優勢
因為myisam儲存了表中的行數記錄,執行select count
() 的時候可以直接獲取到結果,而innodb需要掃瞄全部資料後得到結果。
但是注意一點:對於帶有where 條件的 select count
()語句兩種引擎的表執行過程是一樣的,都需要掃瞄全部資料後得到結果
6、 innodb是為處理巨大資料量時的最大效能設計,它的cpu效率可能是任何其它基於磁碟的關聯式資料庫引擎所不能匹敵的。
7、myisam支援全文索引(fulltext),innodb不支援(5.6以後支援全文索引)
8、myisam引擎的表的查詢、更新、插入的效率要比innodb高
網上擷取了前輩們測試結論:
測試方法:連續提交10個query, 表記錄總數:38萬 , 時間單位 s
引擎型別
myisam
innodb
效能相差
count
0.0008357
3.0163
3609
查詢主鍵
0.005708
0.1574
27.57
查詢非主鍵
24.01
80.37
3.348
更新主鍵
0.008124
0.8183
100.7
更新非主鍵
0.004141
0.02625
6.338
插入0.004188
0.3694
88.21
在我們測試的這個38w的表中,表占用空間的情況如下:
引擎型別
myisam
innodb
資料53,924 kb
58,976 kb
索引13,640 kb
21,072 kb
占用總空間
67,564 kb
80,048 kb
另外乙個176w萬記錄的表, 表占用空間的情況如下:
引擎型別
myisam
innodb
資料56,166 kb
90,736 kb
索引67,103 kb
88,848 kb
占用總空間
123,269 kb
179,584 kb
InnoDB和MyISAM儲存引擎
mysql在檔案系統中將每個資料庫 也可以叫 schema 儲存為資料庫目錄下的乙個子目錄。建立表時,mysql會在資料庫子目錄下建立乙個和表同名的.frm檔案儲存表的定義。而 mysql會在資料庫子目錄下建立乙個和表同名的.frm檔案儲存表的定義。如 建立乙個名為a的表,mysql會在a.frm檔...
InnoDB和MyiSAM的儲存格式
myism物理檔案結構為 myd檔案 myisam儲存引擎專用,用於儲存myisam表的資料 innodb的物理檔案結構為 frm與表相關的元資料資訊都存放在frm檔案,包括表結構的定義資訊等。ibd檔案和.ibdata檔案 這兩種檔案都是存放innodb資料的檔案,之所以用兩種檔案來存放innod...
MyISAM和InnoDB儲存引擎的區別
1 myisam不支援事務處理等高階處理,而innodb支援。2 myisam強調的是效能,速度更快,而innodb提供事務支援以及外來鍵等高階資料庫功能。3 myisam讀效能比innodb強很多,myisam資料和索引是分開的,且索引有壓縮,而innodb是 的,且索引沒有壓縮,對寫操作,myi...