- Select語句優(yōu)化:
- 盡量避免全表掃描, where 及 order by 涉及的列上考慮建立索引
- 避免在SQL里做函數(shù)計算
- 避免索引的最左匹配原則失效
- 索引的范圍至少要達到range
- 使用覆蓋索引可以避免回表
- 避免在 where 子句中使用 不等于:!= 或 <>揖曾,not in 操作符落萎,會造成索引失效
- 禁用or,所有使用or的地方炭剪,都可以使用unit all進行替換
- 慎用in练链,禁止not in,使用between以及exist很多時候是一個好的選擇奴拦。in會使索引失效媒鼓。
- 禁止where 條件中對字段進行表達式運算及函數(shù)操作
- 禁用select * from table,只查詢需要的字段。
- 正確使用聯(lián)合索引時错妖,where中字段順序與索引順序應當一致绿鸣,且最左側(cè)字段必須避免索引失效
- 小表關(guān)聯(lián)大表,from <left_table> <join_type> JOIN <right_table>
若from table1 left join table2=》table1應該是小表暂氯,talbe2應該是大表
若from table1 right join table2=》table2應該是小表潮模,talbe1應該是大表 - 效率上來看:count(字段)<count(主鍵id)<count(1)≈count(),但應該注意業(yè)務邏輯的準確性痴施,即使用不同的的count時擎厢,對null的行的處理是不一樣的。且應該避免使用沒有where條件count辣吃,即全表count动遭,在有g(shù)roup by 的情況下,有時候組合索引會起到意想不到的作用
count()計數(shù)結(jié)果包括NUll
count(1)計數(shù)結(jié)果包括NUll
count(column)忽略Null - 正確使用類型神得,避免隱式轉(zhuǎn)換厘惦,索引失效,on條件及where條件
錯誤的例子:select * from test where tu_mdn_str=13333333333;
正確的例子:select * from test where tu_mdn_str='13333333333';
特別當查詢的字段是字符串時哩簿,等號右邊的條件一定要用引號引起來標明這是一個字符串宵蕉,否則會造成索引失效觸發(fā)全表掃描。 - 涉及到統(tǒng)計聚合類的業(yè)務卡骂,應當對歷史數(shù)據(jù)統(tǒng)計好進行存儲国裳,再組合上當前的數(shù)據(jù)進行查詢
- Where字句中的連接順序,MySQL采用從左往右全跨,自上而下的順序解析where子句缝左,故過濾數(shù)據(jù)多的條件往前放,最快速度縮小結(jié)果集
- Unit 與Unit All的選擇:Unit All不會去重,而Unit則會加上distinct渺杉,從則導致對整個臨時表的數(shù)據(jù)做唯一性校驗蛇数,這樣自然會消耗更多
- 禁止在一張在表使用沒有where語句,以及返回大批量的數(shù)據(jù)是越,所有大表的數(shù)據(jù)返回都應當分頁
- Where與having的選擇:除非一定要使用having耳舅,否則都使用where
- Group by: MySQL對所有GROUP BY col1,col2...的字段進行排序倚评,在某些業(yè)務場景下浦徊,并不需要排序時,則可以指定ORDER By NULL禁止排序天梧,避免排序結(jié)果的消耗
where user_id is not null 可以使group by user_id時使用索引盔性。 - Order by :
用order by子句的重點是是否會產(chǎn)生filesort,order by不按索引順序會出現(xiàn)using filesort呢岗。
能不排序就不排序冕香。若一定要排序,優(yōu)先:通過有序索引順序掃描直接返回有序數(shù)據(jù):
order by 條件要與where中條件一致后豫,順序一致悉尾,否則order by不會利用索引進行排序。
其次使用filesort時挫酿,最好能使用單路排序算法進行排序构眯,max_length_for_sort_data的大小和Query 語句所取出的字段類型大小總和來判定一次掃描算法還是雙路排序算法。
優(yōu)化filesort:加大 max_length_for_sort_data 參數(shù)的設置早龟;去掉不必要的返回字段鸵赖;增大 sort_buffer_size 參數(shù)設置
https://blog.csdn.net/weixin_34082854/article/details/93633860 - Limit優(yōu)化:
在索引排序完成排序分頁的操作,最后根據(jù)主鍵關(guān)聯(lián)回原表查詢所需要的其他列內(nèi)容;
把limit m,n 轉(zhuǎn)換成 limit n的查詢,通過m,n計算出一個位置拄衰,使用where條件然后從這個位置開始limit n,例如:
假設某張記錄表饵骨,主鍵連續(xù)遞增,中間不斷層翘悉,則要先根據(jù)m,nt計算出id的位置,然后使用where id >位置 limit n進行分頁 - 子查詢優(yōu)化:嘗試轉(zhuǎn)化成關(guān)聯(lián)查詢有時候是一個不錯的選擇居触,原則是相關(guān)子系統(tǒng)都可以轉(zhuǎn)換成關(guān)聯(lián)查詢
- is null妖混,is not null也無法使用索引。盡量設置初始值轮洋。
- like以通配符開頭('%abc..')也會導致索引失效
通過覆蓋索引可以解決like '%字符串%'索引失效的問題制市。 - 范圍查詢阻斷,聯(lián)合索引的后續(xù)字段不能走索引弊予。