一、使用的鎖
-
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