MyISAM和InnoDB的區別

一、使用的鎖

  • MyISAM:
    myisam只支持表級鎖,用戶在操作myisam表時,select,update,delete,insert語句都會給表自動加鎖,如果加鎖以後的表滿足insert併發的情況下,可以在表的尾部插入新的數據。也可以通過lock table命令來鎖表,這樣操作主要是可以模仿事務,但是消耗非常大,一般只在實驗演示中使用。

  • InnoDB :
    Innodb支持事務和行級鎖,是innodb的最大特色。
    事務的ACID屬性:atomicity,consistent,isolation,durable。
    併發事務帶來的幾個問題:更新丟失,髒讀,不可重複讀,幻讀。

  鎖的機制可參考:MySQL鎖機制

二、實現上的區別

  1、InnoDB支持事務,MyISAM不支持。對於InnoDB每一條SQL語言都默認封裝成事務,自動提交,這樣會影響速度,所以最好把多條SQL語言放在begin和commit之間,組成一個事務;
  2、InnoDB支持外鍵,而MyISAM不支持。
  3、InnoDB是聚集索引,使用B+Tree作爲索引結構,數據文件是和(主鍵)索引綁在一起的(表數據文件本身就是按B+Tree組織的一個索引結構),必須要有主鍵,通過主鍵索引效率很高。MyISAM是非聚集索引,也是使用B+Tree作爲索引結構,索引和數據文件是分離的,索引保存的是數據文件的指針。主鍵索引和輔助索引是獨立的。

myisam允許沒有任何索引和主鍵的表存在
innodb引擎如果沒有設定主鍵或者非空唯一索引,就會自動生成一個6字節的主鍵(用戶不可見)

  4、InnoDB不保存表的具體行數,執行select count(*) from table時需要全表掃描。而MyISAM用一個變量保存了整個表的行數,執行上述語句時只需要讀出該變量即可,速度很快。
  5、Innodb不支持全文索引,而MyISAM支持全文索引,查詢效率上MyISAM要高;5.7以後的InnoDB支持全文索引了。
  6、InnoDB支持表、行級鎖(默認),而MyISAM支持表級鎖。
  7、InnoDB表必須有主鍵(用戶沒有指定的話會自己找或生產一個主鍵),而Myisam可以沒有。
  8、Innodb存儲文件有frm、ibd,而Myisam是frm、MYD、MYI。

.frm 用於存儲表的定義
.MYD 用於存放數據
.MYI 用於存放表索引

三、sql優化的注意點

  1、使用EXPLAIN關鍵詞檢查SQL。EXPLAIN可以幫你分析你的查詢語句或是表結構的性能瓶頸,就得EXPLAIN 的查詢結果還會告訴你你的索引主鍵被如何利用的,你的數據表是如何被搜索和排序的,是否有全表掃描等;
  2、查詢的條件儘量使用索引字段,如某一個表有多個條件,就儘量使用複合索引查詢,複合索引使用要注意字段的先後順序。
  3、多表關聯儘量用join,減少子查詢的使用。表的關聯字段如果能用主鍵就用主鍵,也就是儘可能的使用索引字段。如果關聯字段不是索引字段可以根據情況考慮添加索引。
  4、儘量使用limit進行分頁批量查詢,不要一次全部獲取。
  5、絕對避免select *的使用,儘量select具體需要的字段,減少不必要字段的查詢;
  6、儘量將or 轉換爲 union all。
  7、儘量避免使用is null或is not null。
  8、要注意like的使用,前模糊和全模糊不會走索引。
  9、Where後的查詢字段儘量減少使用函數,因爲函數會造成索引失效。
  10、避免使用不等於(!=),因爲它不會使用索引。
  11、用exists代替in,not exists代替not in,效率會更好;
  12、避免使用HAVING子句, HAVING 只會在檢索出所有記錄之後纔對結果集進行過濾,這個處理需要排序,總計等操作。如果能通過WHERE子句限制記錄的數目,那就能減少這方面的開銷。
  13、千萬不要 ORDER BY RAND()

參考文獻

1、https://mp.weixin.qq.com/s/KVY9StAhXGTy1jshHHkawQ
2、https://www.cnblogs.com/y-rong/p/8110596.html

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