溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

mysql中MyISAM和InnoDB有哪些不同點

發(fā)布時間:2022-11-09 09:44:31 來源:億速云 閱讀:133 作者:iii 欄目:MySQL數(shù)據(jù)庫

本篇內(nèi)容介紹了“mysql中MyISAM和InnoDB有哪些不同點”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

區(qū)別:1、InnoDB支持事務(wù),MyISAM不支持;2、InnoDB支持外鍵,而MyISAM不支持;3、InnoDB是聚集索引,而MyISAM是非聚集索引;4、Innodb不支持全文索引,而MyISAM支持全文索引;5、InnoDB支持表、行級鎖,而MyISAM支持表級鎖;6、InnoDB表必須有唯一索引,而Myisam可以沒有;7、存儲文件不同。

InnoDB:MySQL默認的事務(wù)型引擎,也是最重要和使用最廣泛的存儲引擎。它被設(shè)計成為大量的短期事務(wù),短期事務(wù)大部分情況下是正常提交的,很少被回滾。InnoDB的性能與自動崩潰恢復(fù)的特性,使得它在非事務(wù)存儲需求中也很流行。除非有非常特別的原因需要使用其他的存儲引擎,否則應(yīng)該優(yōu)先考慮InnoDB引擎。

MyISAM:在MySQL 5.1 及之前的版本,MyISAM是默認引擎。MyISAM提供的大量的特性,包括全文索引、壓縮、空間函數(shù)(GIS)等,但MyISAM并不支持事務(wù)以及行級鎖,而且一個毫無疑問的缺陷是崩潰后無法安全恢復(fù)。

mysql中MyISAM和InnoDB的區(qū)別:

1. InnoDB支持事務(wù),MyISAM不支持,對于InnoDB每一條SQL語言都默認封裝成事務(wù),自動提交,這樣會影響速度,所以最好把多條SQL語言放在begin和commit之間,組成一個事務(wù);  

2. InnoDB支持外鍵,而MyISAM不支持。對一個包含外鍵的InnoDB表轉(zhuǎn)為MYISAM會失??;  

3. InnoDB是聚集索引,使用B+Tree作為索引結(jié)構(gòu),數(shù)據(jù)文件是和(主鍵)索引綁在一起的(表數(shù)據(jù)文件本身就是按B+Tree組織的一個索引結(jié)構(gòu)),必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然后再通過主鍵查詢到數(shù)據(jù)。因此,主鍵不應(yīng)該過大,因為主鍵太大,其他索引也都會很大。

      MyISAM是非聚集索引,也是使用B+Tree作為索引結(jié)構(gòu),索引和數(shù)據(jù)文件是分離的,索引保存的是數(shù)據(jù)文件的指針。主鍵索引和輔助索引是獨立的。

也就是說:InnoDB的B+樹主鍵索引的葉子節(jié)點就是數(shù)據(jù)文件,輔助索引的葉子節(jié)點是主鍵的值;而MyISAM的B+樹主鍵索引和輔助索引的葉子節(jié)點都是數(shù)據(jù)文件的地址指針。

mysql中MyISAM和InnoDB有哪些不同點

mysql中MyISAM和InnoDB有哪些不同點

4. InnoDB不保存表的具體行數(shù),執(zhí)行select count(*) from table時需要全表掃描。而MyISAM用一個變量保存了整個表的行數(shù),執(zhí)行上述語句時只需要讀出該變量即可,速度很快(注意不能加有任何WHERE條件);

那么為什么InnoDB沒有了這個變量呢?

因為InnoDB的事務(wù)特性,在同一時刻表中的行數(shù)對于不同的事務(wù)而言是不一樣的,因此count統(tǒng)計會計算對于當(dāng)前事務(wù)而言可以統(tǒng)計到的行數(shù),而不是將總行數(shù)儲存起來方便快速查詢。InnoDB會嘗試遍歷一個盡可能小的索引除非優(yōu)化器提示使用別的索引。如果二級索引不存在,InnoDB還會嘗試去遍歷其他聚簇索引。
    如果索引并沒有完全處于InnoDB維護的緩沖區(qū)(Buffer Pool)中,count操作會比較費時??梢越⒁粋€記錄總行數(shù)的表并讓你的程序在INSERT/DELETE時更新對應(yīng)的數(shù)據(jù)。和上面提到的問題一樣,如果此時存在多個事務(wù)的話這種方案也不太好用。如果得到大致的行數(shù)值已經(jīng)足夠滿足需求可以嘗試SHOW TABLE STATUS

5. Innodb不支持全文索引,而MyISAM支持全文索引,在涉及全文索引領(lǐng)域的查詢效率上MyISAM速度更快高;PS:5.7以后的InnoDB支持全文索引了

6. MyISAM表格可以被壓縮后進行查詢操作

7. InnoDB支持表、行(默認)級鎖,而MyISAM支持表級鎖

InnoDB的行鎖是實現(xiàn)在索引上的,而不是鎖在物理行記錄上。潛臺詞是,如果訪問沒有命中索引,也無法使用行鎖,將要退化為表鎖。

例如:

t_user(uid, uname, age, sex) innodb;
 
    uid PK
    無其他索引
    update t_user set age=10 where uid=1;             命中索引,行鎖。
 
    update t_user set age=10 where uid != 1;           未命中索引,表鎖。
 
    update t_user set age=10 where name='chackca';    無索引,表鎖。

8、InnoDB表必須有唯一索引(如主鍵)(用戶沒有指定的話會自己找/生產(chǎn)一個隱藏列Row_id來充當(dāng)默認主鍵),而Myisam可以沒有

9、Innodb存儲文件有frm、ibd,而Myisam是frm、MYD、MYI

       Innodb:frm是表定義文件,ibd是數(shù)據(jù)文件

       Myisam:frm是表定義文件,myd是數(shù)據(jù)文件,myi是索引文件

如何選擇:

   1. 是否要支持事務(wù),如果要請選擇innodb,如果不需要可以考慮MyISAM;

   2. 如果表中絕大多數(shù)都只是讀查詢,可以考慮MyISAM,如果既有讀也有寫,請使用InnoDB。

   3. 系統(tǒng)奔潰后,MyISAM恢復(fù)起來更困難,能否接受;

   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),自適應(yīng)哈希索引(ahi),預(yù)讀(read ahead)

“mysql中MyISAM和InnoDB有哪些不同點”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI