資料庫-->總結資料庫查詢調優
在我們平時的工作專案中,會經常性的跟資料庫打交道,如何寫出一條優雅有高效的sql指令碼,提高我們業務查詢的效率是我們每一個程式設計師都必須要考慮的問題。博主在上家公司接手了一個外派專案,光是做sql優化就已經搞死了我們多少小夥伴。之後的幾次面試經歷也發現,對於資料庫調優確實非常的重要,於是找了時間查了一些網上提供的方案,以及博主個人實際專案的總結,最終給出以下幾條調優建議。
Mysql調優總結
0、開啟慢查詢輸出
指定慢查詢的時間,將多餘此時間的慢查詢sql輸出到log裡 Show variables like 'long_query_time'; 顯示慢查詢時間 Set long_query_time=2; 設定慢查詢時間
1、使用EXPLAN檢視執行計劃
關注type和key type:至少達到range級別,避免all key:索引名
2、能用between就不用了in
3、select 後面指明查詢的欄位名 禁止 * 會造成不必要的CPU/IO/記憶體/頻寬
4、如果排序欄位沒有用到索引,就儘量少排序
5、如果限制條件中其他欄位沒有索引,儘量少用or,用union all或union代替
6、儘量用union all代替union
union和union all的差異主要是前者需要將結果集合並後再進行唯一性過濾操作,這就會涉及到排序, 增加大量的CPU運算,加大資源消耗及延遲。當然,union all的前提條件是兩個結果集沒有重複資料。
7、in和exists 、not in和not exists
in適合於外表大而內表小的情況
exists適合外表小內表大的情況 推薦使用not exists
8、分頁查詢建議先取上一頁最大行數的ID來限制下一頁的起點
9、避免在where子句中對欄位進行值判斷 會導致索引失效
10、不建議使用%字首模糊查詢 會導致索引失效
11、避免在where子句中對欄位進行表示式操作 會導致索引失效
12、避免隱式型別轉換
where子句中出現column欄位的型別和傳入的引數型別不一致的時候發生的型別轉換,建議先確定where中的引數型別。
13、對於聯合索引來說,要遵守最左字首匹配規則
14、必要時可以使用force index來強制查詢走某個索引
15、注意範圍查詢語句
對於聯合索引來說,如果存在範圍查詢,比如between、>、<等條件時,會造成後面的索引欄位失效。
16、關於JOIN優化
儘量使用inner join,避免left join 合理利用索引:被驅動表的索引欄位作為on的限制欄位 利用小表去驅動大表
17、高頻率的欄位加上索引,提高查詢效率
18、根據業務需要做相關欄位的冗餘
持續更