天天看點

MySQL慢SQL優化基礎知識執行計劃案例分析

基礎知識

慢SQL官方定義

If a query takes longer than this many seconds, the server increments the Slow_queries status variable. If the slow query log is enabled, the query is logged to the slow query log file; Unit:Second.

阿裡雲控制台慢SQL參數

MySQL慢SQL優化基礎知識執行計劃案例分析

SQL優化原因與影響

•SQL優化原因:查詢效率低的SQL(慢SQL)會占用機器大量的CPU、記憶體和IO資源,影響正常業務。

•慢SQL現象/影響:SQL查詢緩慢、業務逾時、資料庫機器CPU/IO飙升、業務連接配接不上資料庫、現網故障等。

SQL語句執行過程

MySQL慢SQL優化基礎知識執行計劃案例分析

Optimizer查詢優化器方式

邏輯優化

優化器的邏輯優化,即根據關系代數規則,對SQL語句進行等價變化:

(1) 對投影、選擇等操作進行句式優化;

(2) 對條件表達式進行謂詞優化、條件化簡;

(3) 對連接配接語義進行外連接配接、嵌套連接配接的優化;

(4) 對集合、GROUP BY、ORDER BY等優化

(5) 子查詢優化、視圖重寫、語義優化

邏輯優化例子

條件化簡 :

select id,sfzh,address from t1 where 1=1 and name ='宸謙';           

子查詢優化 :

select * from t1 where a in (select a from t2);           

優化器邏輯優化結果:

select t1.* from t1 join t2 on t1.a= t2.a;           

實體優化

實體優化的總代價模型 Cost = CPU Cost + IO Cost

(1) CPU Cost:MySQL Server層,處理傳回記錄所花開銷。

CPU Cost = records / TIME_FOR_COMPARE =

records / 5,即每5條記錄的處理時間,作為 1 CPU Cost。

(2) IO Cost:存儲引擎層面,讀取頁面的IO開銷。

執行計劃

檢視

在SQL語句前加explain關鍵字可檢視SQL語句的執行計劃,

常用文法:

(1)explain extended(輸出更多擴充資訊)

(2)explain format=json (json格式輸出,可看到cost等資訊)

MySQL慢SQL優化基礎知識執行計劃案例分析

結果字段注解

MySQL慢SQL優化基礎知識執行計劃案例分析

案例分析

優化原則

優化總原則:業務側優化 > SQL 優化 > 資料庫+作業系統參數優化

SQL優化原則:高頻SQL收益 > 低頻SQL收益

業務側優化例子:

(1)某業務每隔1分鐘會并發幾十路去資料庫查詢A表(全表掃描),造成其他業務響應逾時

(2)統計分析類SQL拆分,熱點資料緩存

慢SQL例子

SELECT
    count(*) count
FROM
    app_mst
LEFT JOIN app_profile ON app_mst.app_id = app_profile.app_id
LEFT JOIN app_apply_step ON app_mst.app_id = app_apply_step.app_id
WHERE
    app_apply_step.is_exp = '0';           

執行計劃:

MySQL慢SQL優化基礎知識執行計劃案例分析

優化步驟

(1)檢視執行計劃:

在SQL前加上 explain extended,主要關注key(用到什麼索引)、rows(查詢執行掃描的元組個數)、extra(是否利用到排序、臨時表等)。

MySQL慢SQL優化基礎知識執行計劃案例分析

(2)檢視SQL涉及的表結構,此處主要檢視app_apply_step 表:

show create table app_apply_step, 主要關注表的索引和where 條件中的字段類型。可見 app_apply_step 表 is_exp 字段上無索引,且為tinyint類型。

MySQL慢SQL優化基礎知識執行計劃案例分析

(3)思考可能優化的點:

先檢視表 app_apply_step 

字段is_exp的索引區分度 ,執行語句:

select count(distinct col1),

count(distinct col2)/count(*) from tb_name;

MySQL慢SQL優化基礎知識執行計劃案例分析

(4)is_exp 字段區分度約等于0,表明通過索引篩選非常高效。

alter table

app_apply_step

add index

idx_is_exp

(

is_exp

);

MySQL慢SQL優化基礎知識執行計劃案例分析

優化步驟總結

  1. 檢視執行計劃 explain extended
  2. 如果有告警資訊,檢視告警資訊 show warnings;
  3. 檢視SQL涉及的表結構和索引資訊
  4. 根據執行計劃,思考可能的優化點
  5. 按照可能的優化點執行表結構變更、增加索引、SQL改寫等操作
  6. 檢視優化後的執行時間和執行計劃
  7. 如果優化效果不明顯,重複第四步操作

慢SQL常見問題彙總

MySQL慢SQL優化基礎知識執行計劃案例分析