mysql優化之sql優化原則
以下內容來自小馬哥視訊學習筆記。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
原則一:選擇需要優化的sql
1 選擇更需要優化的sql:高併發 低消耗的sql。
例項:A語句 1小時請求1W次,1次10個IO;B語句 1小時請求10次,1次1W個IO;
1)從單位時間產生的IO總數來說,相同的;
2)針對一個SQL,如果我能把10個IO變成7個IO,一小時減少3W個IO; 針對第二個SQL,如果能把1W個IO變成7K個IO,一小時減少3W個IO;
3)從優化難度上講,1W->7K難的多;
4)從整體效能上來說,第一個SQL的優化能夠極大的提升系統整體的效能;第二個SQL慢一點,無非也就是10個連線查詢慢一點;
2 定位效能瓶頸:SQL執行較慢有兩個影響原因,IO和CPU,明確性能瓶頸所在,明確優化目標。
原則二:使用explain和profile指令
1 首先明確你需要的執行計劃,再使用Explain檢查;
2 任何SQL的優化,都從Explain語句開始;Explain語句能夠得到資料庫執行該SQL選擇的執行計劃;
3 使用profile明確SQL的問題和優化的結果;
原則三:小結果集驅動大結果集
以join為例:
1 JOIN的原理: 在mysql中使用Nested Loop Join來實現join; A JOIN B:通過A表的結果集作為迴圈基礎,一條一條的通過結果集中的資料作為過濾條件到下一個表中查詢資料,然後合併結果;
select A.a,B.b from A join B on A.xx=B.yy where B.zz=0;
執行流程:for(id in A){
select * from B where B.xx=id;
}
再從中間結果集中用B.zz=0去過濾資料。
2 JOIN的優化原則: 1)儘可能減少Join 語句中的迴圈總次數,用小結果集驅動大結果集;
2)優先優化Nested Loop 的內層迴圈;
3)保證Join 語句中被驅動表上Join 條件欄位已經被索引;
4)擴大join buffer的大小;
原則四:在索引中完成排序
原則五:使用最少的column
1 可以減少網路傳輸量
2 MySQL排序原理是將所有column資料取出,在排序快取區排序,再返回結果,如果column多,資料量大,排序區容量不夠時,
就會先用排序所用column進行排序,再去取資料,再返回,多次請求資料庫。
原則六:使用最有效的過濾條件
1 過多的WHERE條件不一定能夠提高訪問效能;
2 一定要讓where條件使用自己預期的執行計劃;
原則七:避免複雜的JOIN和子查詢
1 複雜的JOIN和子查詢,需要鎖定過多的資源,MYSQL在大量併發情況下處理鎖定效能下降較快;
2 不要過多依賴SQL的功能,把複雜的SQL拆分為簡單的SQL;
3 MySQL子查詢效能較低,應儘量避免使用;