一條sql的執行返回,時間過長,怎麼辦?如何優化,這就要從mysql的執行計劃說起
mysql的執行計劃:通過EXPLAIN SELECT * from A where X=? and Y=?
執行計劃一般包括如下:
1。id
id相同,執行順序由上而下,id不同,值越大越先被執行
2。selectType
3.table
table表示查詢涉及的表或衍生的表
4.type
這個欄位是優化sql的重要欄位,也是我們判斷sql性能和優化程度重要指標。他的取值類型範圍:
執行效率:
ALL < index < range< ref < eq_ref < const < system。對於我們平時查詢執行計劃,優化sql來說,最好是避免ALL和index
它表示Mysql在執行該sql語句的時候,可能用到的索引信息,僅僅是可能,實際不一定會用到。
此欄位是 mysql 在當前查詢時所真正使用到的索引。 他是possible_keys的子集
表示查詢優化器使用了索引的位元組數,這個欄位可以評估組合索引是否完全被使用,這也是我們優化sql時,評估索引的重要指標
rows 也是一個重要的欄位,mysql 查詢優化器根據統計信息,估算該sql返回結果集需要掃描讀取的行數,這個值相關重要,索引優化之後,掃描讀取的行數越多,說明要麼是索引設置不對,要麼是欄位傳入的類型之類的問題,說明要優化空間越大
10.filtered
filtered參數,它指返回結果的行占需要讀到的行(rows列的值)的百分比,就是百分比越高,說明需要查詢到數據越準確, 百分比越小,說明查詢到的數據量大,而結果集很少
11.extra
實際案例優化
這是建表的sql信息:通過 show create table A;
有一個查詢語句,這是歷史遺留的sql,
select id from trade_iapreceipt where selectUserId=0 and selectOrderNo=2 and (status= 1 or status = 1) limit 1;
彷彿一看,也沒啥問題,索引也用到了,key欄位顯示,Extra顯示使用index排序了,但是根據類型type為index,說明這是個全索引掃描,效率很低的,最後命中的索引userStatus,這是在測試環境上數據比較少,到了生產環境數據量相當大,rt就升高了,這是看著沒有問題,然後仔細觀察,發現原來在表中,selectUserId是varchar類型,結果查詢的時候,傳入的是整數,mysql做了類型轉換,導致了全索引掃描。
之後sql進行了修改,發現明顯提升,用了索引,而且掃描的行數明顯減少,線上執行效率很高