mysql延時優化教程 mysql 執行計畫詳解

2021-10-14 08:17:20 字數 1524 閱讀 8356

一條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,

selectidfromtrade_iapreceipt where selectuserid=0 and selectorderno='2' and (status= '1' or status = '1') limit 1;

表面一看,沒啥問題,應該會命中索引userstatus, 在實際生產上,執行時間較長,看看它的執行計畫,

彷彿一看,也沒啥問題,索引也用到了,key欄位顯示,extra顯示使用index排序了,但是根據型別type為index,說明這是個全索引掃瞄,效率很低的,最後命中的索引userstatus,這是在測試環境上資料比較少,到了生產環境資料量相當大,rt就公升高了,這是看著沒有問題,然後仔細觀察,發現原來在表中,selectuserid是varchar型別,結果查詢的時候,傳入的是整數,mysql做了型別轉換,導致了全索引掃瞄。

之後sql進行了修改,發現明顯提公升,用了索引,而且掃瞄的行數明顯減少,線上執行效率很高

mysq基礎優化

skip name resolve skip locking skip innodb skip bdb key buffer 1g記憶體推薦設定為256m,2g記憶體推薦設定為512m wait timeout 3或者5 2g記憶體推薦設定為5 max connections 如果訪問量很大可以設定...

Mysql索引優化教程

myisam表的資料檔案和索引檔案是自動分開的 innodb的資料和索引是儲存在同乙個表空間裡面,但可以有多個檔案組成。建立索引語法如下 create unique fulltext spatial index index name using index type on tbl name inde...

Mysql索引優化教程

b 索引的儲存分類 b myisam表的資料檔案和索引檔案是自動分開的 innodb的資料和索引是儲存在同乙個表空間裡面,但可以有多個檔案組成。建立索引語法如下 create unique fulltext spatial index index name using index type on t...