Mysql的InnoDB和MyIsam存儲引擎9點區別(清晰明瞭)

原文鏈接:https://blog.csdn.net/qq_35642036/article/details/82820178

區別:

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

2. InnoDB支持外鍵,而MyISAM不支持。對一個包含外鍵的InnoDB錶轉爲MYISAM會失敗; 

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

       MyISAM是非聚集索引,也是使用B+Tree作爲索引結構,索引和數據文件是分離的,索引保存的是數據文件的指針。主鍵索引和輔助索引是獨立的。

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

 

4. InnoDB不保存表的具體行數,執行select count(*) from table時需要全表掃描。而MyISAM用一個變量保存了整個表的行數,執行上述語句時只需要讀出該變量即可,速度很快;

5. Innodb不支持全文索引,而MyISAM支持全文索引,查詢效率上MyISAM要高;5.7以後的InnoDB支持全文索引了

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

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

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

例如:

    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='shenjian';    無索引,表鎖。
 

8、InnoDB表必須有主鍵(用戶沒有指定的話會自己找或生產一個主鍵),而Myisam可以沒有

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

        Innodb:frm是表定義文件,ibd是數據文件

        Myisam:frm是表定義文件,myd是數據文件,myi是索引文件

如何選擇:

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

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

    3. 系統奔潰後,MyISAM恢復起來更困難,能否接受;

    4. MySQL5.5版本開始Innodb已經成爲Mysql的默認引擎(之前是MyISAM),說明其優勢是有目共睹的,如果你不知道用什麼,那就用InnoDB,至少不會差。

 

InnoDB爲什麼推薦使用自增ID作爲主鍵?

    答:自增ID可以保證每次插入時B+索引是從右邊擴展的,可以避免B+樹和頻繁合併和分裂(對比使用UUID)。如果使用字符串主鍵和隨機主鍵,會使得數據隨機插入,效率比較差。

 

innodb引擎的4大特性

       插入緩衝(insert buffer),二次寫(double write),自適應哈希索引(ahi),預讀(read ahead)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章