sql語句性能優化

須要的準備知識mysql

1最左前綴匹配sql

mysql會一直向右匹配直到遇到範圍查詢(><betweenlike)就中止匹配,大數據

對於where條件 優化

a = 1 and b> 2 and c = 3spa

若是咱們創建(a,b,c)順序的索引,blog

那麼c 是用不到索引的,若是創建(a,c,b)的索引則均可以用到,a,c的順序能夠任意調整。排序

當咱們創建(a,b)的複合索引索引

對於where條件 it

a = 1 依然是能夠用到索引的。io

注意:

=in能夠亂序,好比a = 1 and b = 2 and c = 3 創建(a,b,c)索引能夠任意順序,

mysql的查詢優化器會幫你優化成索引能夠識別的形式

2 sql索引原則

2.1索引列的區分度儘可能要高,區分度的計算公式count(distinct col)/count(*)

惟一鍵的區分度是1,而好比相似 狀態,性別等字段在大數據面前區分度是0

2.2要保持索引列的值的乾淨,不能參與計算

好比 假如用戶年齡上有索引

      Select id from user where age>2 (會走索引)

  Select id from user where age-2>0 (不會走索引)

2.3儘可能的擴展索引,不要新建索引。好比表中已經有a的索引,如今要加(a,b)的索引

修改便可。

3優化神器 explain / desc 的使用

在你原來的sql語句以前加上 explain 就能夠查看mysql對於該語句的執行計劃

以下圖所示

 

 

type

const(常量鏈接),好比SELECT * FROM user WHERE id=1;  

eq_ref(等值引用),好比SELECT * FROM user,card WHERE user.id=card.userid;  

ref(引用),用於非惟一索引,好比SELECT * FROM user,card WHERE user.last_name='test';  

range(範圍),好比SELECT * FROM tbl_name WHERE key_column > 10;  

unique_subquery  子查詢 針對惟一索引或者主鍵

index_subquery  子查詢 針對非惟一索引列

index(索引),根據索引來讀取數據,若是索引已包含了查詢數據,只需掃描索引樹,不然執行全表掃描和All相似;  

ALL(全部),全表掃描  

Extra

Using index:表示使用索引,若是同時出現Using where,表明使用索引來查找讀取記錄,若是沒有Using where,表示索引包含查詢數據,無需額外的查找;

Using where:表示條件查詢,若是type列是ALLindex,而沒有出現該信息,則你有可能在執行錯誤的查詢:返回全部數據;  

Using filesort:不是「使用文件索引」的含義!filesortMySQL所實現的一種排序策略,一般在使用到排序語句ORDER BY的時候,會出現該信息;  [非索引字段排序]

Using temporary:表示爲了獲得結果,使用了臨時表,這一般是出如今多表聯合查詢,結果排序的場合。

咱們須要重點關注rows

 

優化方法(步驟)

1.先運行看看是否真的很慢,注意看是否設置了SQL_NO_CACHE。優化以前先關閉。

2.explain查看執行計劃,看那些地方比較慢

3.order by limit 形式的sql語句讓排序的表優先查(也就是遇到這類狀況,咱們能夠先去掉order by limit 看是否是他致使的

4.加索引時參照上面的sql索引原則

5.觀察結果,不符合預期繼續從1分析

相關文章
相關標籤/搜索