須要的準備知識mysql
1最左前綴匹配sql
mysql會一直向右匹配直到遇到範圍查詢(>、<、between、like)就中止匹配,大數據
對於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列是ALL或index,而沒有出現該信息,則你有可能在執行錯誤的查詢:返回全部數據;
Using filesort:不是「使用文件索引」的含義!filesort是MySQL所實現的一種排序策略,一般在使用到排序語句ORDER BY的時候,會出現該信息; [非索引字段排序]
Using temporary:表示爲了獲得結果,使用了臨時表,這一般是出如今多表聯合查詢,結果排序的場合。
咱們須要重點關注rows。
優化方法(步驟)
1.先運行看看是否真的很慢,注意看是否設置了SQL_NO_CACHE。優化以前先關閉。
2.explain查看執行計劃,看那些地方比較慢
3.order by limit 形式的sql語句讓排序的表優先查(也就是遇到這類狀況,咱們能夠先去掉order by limit 看是否是他致使的)
4.加索引時參照上面的sql索引原則
5.觀察結果,不符合預期繼續從1分析