MySQL MyISAM 與InnoDB 的區(qū)別
區(qū)別:
1. InnoDB支持事務,MyISAM不支持,對于InnoDB每一條SQL語言都默認封裝成事務,自動提交,這樣會影響速度,所以最好把多條SQL語言放在begin和commit之間,組成一個事務;
2. InnoDB支持外鍵,而MyISAM不支持。對一個包含外鍵的InnoDB表轉為MYISAM會失敗;
3. InnoDB是聚集索引,使用B+Tree作為索引結構,數(shù)據(jù)文件是和(主鍵)索引綁在一起的(表數(shù)據(jù)文件本身就是按B+Tree組織的一個索引結構),必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然后再通過主鍵查詢到數(shù)據(jù)。因此,主鍵不應該過大,因為主鍵太大,其他索引也都會很大。
MyISAM是非聚集索引,也是使用B+Tree作為索引結構,索引和數(shù)據(jù)文件是分離的,索引保存的是數(shù)據(jù)文件的指針。主鍵索引和輔助索引是獨立的。
也就是說:InnoDB的B+樹主鍵索引的葉子節(jié)點就是數(shù)據(jù)文件,輔助索引的葉子節(jié)點是主鍵的值;而MyISAM的B+樹主鍵索引和輔助索引的葉子節(jié)點都是數(shù)據(jù)文件的地址指針。
4. InnoDB不保存表的具體行數(shù),執(zhí)行select count(*) from table時需要全表掃描。而MyISAM用一個變量保存了整個表的行數(shù),執(zhí)行上述語句時只需要讀出該變量即可,速度很快(注意不能加有任何WHERE條件);
那么為什么InnoDB沒有了這個變量呢?
因為InnoDB的事務特性,在同一時刻表中的行數(shù)對于不同的事務而言是不一樣的,因此count統(tǒng)計會計算對于當前事務而言可以統(tǒng)計到的行數(shù),而不是將總行數(shù)儲存起來方便快速查詢。InnoDB會嘗試遍歷一個盡可能小的索引除非優(yōu)化器提示使用別的索引。如果二級索引不存在,InnoDB還會嘗試去遍歷其他聚簇索引。如果索引并沒有完全處于InnoDB維護的緩沖區(qū)(Buffer Pool)中,count操作會比較費時。可以建立一個記錄總行數(shù)的表并讓你的程序在INSERT/DELETE時更新對應的數(shù)據(jù)。和上面提到的問題一樣,如果此時存在多個事務的話這種方案也不太好用。如果得到大致的行數(shù)值已經(jīng)足夠滿足需求可以嘗試SHOW TABLE STATUS
5. Innodb不支持全文索引,而MyISAM支持全文索引,在涉及全文索引領域的查詢效率上MyISAM速度更快高;PS:5.7以后的InnoDB支持全文索引了
6. MyISAM表格可以被壓縮后進行查詢操作
7. InnoDB支持表、行(默認)級鎖,而MyISAM支持表級鎖
InnoDB的行鎖是實現(xiàn)在索引上的,而不是鎖在物理行記錄上。潛臺詞是,如果訪問沒有命中索引,也無法使用行鎖,將要退化為表鎖。
8、InnoDB表必須有主鍵(用戶沒有指定的話會自己找或生產(chǎn)一個主鍵),而Myisam可以沒有
9、Innodb存儲文件有frm、ibd,而Myisam是frm、MYD、MYI
Innodb:frm是表定義文件,ibd是數(shù)據(jù)文件
Myisam:frm是表定義文件,myd是數(shù)據(jù)文件,myi是索引文件
如何選擇:
1. 是否要支持事務,如果要請選擇innodb,如果不需要可以考慮MyISAM;
2. 如果表中絕大多數(shù)都只是讀查詢,可以考慮MyISAM,如果既有讀也有寫,請使用InnoDB。
3. 系統(tǒng)奔潰后,MyISAM恢復起來更困難,能否接受;
4. MySQL5.5版本開始Innodb已經(jīng)成為Mysql的默認引擎(之前是MyISAM),說明其優(yōu)勢是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不會差。
InnoDB為什么推薦使用自增ID作為主鍵?
答:自增ID可以保證每次插入時B+索引是從右邊擴展的,可以避免B+樹和頻繁合并和分裂(對比使用UUID)。如果使用字符串主鍵和隨機主鍵,會使得數(shù)據(jù)隨機插入,效率比較差。
innodb引擎的4大特性
插入緩沖(insert buffer),二次寫(double write),自適應哈希索引(ahi),預讀(read ahead)
以上就是MySQL MyISAM與InnoDB 的區(qū)別的詳細內(nèi)容,更多關于MySQL MyISAM與InnoDB 的資料請關注好吧啦網(wǎng)其它相關文章!
相關文章:
1. MySQL刪除數(shù)據(jù),表文件大小依然沒變的原因2. 簡單了解mysql語句書寫和執(zhí)行順序3. 50種方法巧妙優(yōu)化你的SQL Server數(shù)據(jù)庫4. Access數(shù)據(jù)庫安全的幾個問題5. 數(shù)據(jù)庫Oracle9i的企業(yè)管理器簡介6. mysql數(shù)據(jù)庫中最常用的時間轉換函數(shù)的用法7. 在redhat 9 上安裝oracle 9.2.0.4 時,DBCA 出錯的解決辦法8. oracle觸發(fā)器介紹9. DB2的表數(shù)據(jù)加密10. DB2中創(chuàng)建一個獲取漢字拼音首字母的SQL函數(shù)
