京東云TiDB SQL優化的最佳實踐

京東云TiDB SQL層的背景介紹【京東云TiDB SQL優化的最佳實踐】從總體上概括 TiDB 和 MySQL 兼容策略,如下表:

京東云TiDB SQL優化的最佳實踐

文章插圖
SQL層的架構用戶的 SQL 請求會直接或者通過 Load Balancer 發送到 京東云TiDB Server,TiDB Server 會解析 MySQL Protocol Packet,獲取請求內容,對 SQL 進行語法解析和語義分析,制定和優化查詢計劃,執行查詢計劃并獲取和處理數據 。數據全部存儲在 TiKV 集群中 , 所以在這個過程中 TiDB Server 需要和 TiKV 交互 , 獲取數據 。最后 TiDB Server 需要將查詢結果返回給用戶 。
京東云TiDB SQL優化的最佳實踐

文章插圖
一條SQL的生命周期圖
●SQL優化流程的概覽在 TiDB 中,從輸入的查詢文本到最終的執行計劃執行結果的過程可以見下圖:
京東云TiDB SQL優化的最佳實踐

文章插圖
在經過了 parser 對原始查詢文本的解析以及一些簡單的合法性驗證后 , TiDB 首先會對查詢做一些邏輯上的等價變化,通過這些等價變化,使得這個查詢在邏輯執行計劃上可以變得更易于處理 。在等價變化結束之后,TiDB 會得到一個與原始查詢等價的查詢計劃結構 , 之后根據數據分布、以及一個算子具體的執行開銷,來獲得一個最終的執行計劃,同時,TiDB 在執行 PREPARE 語句時,可以選擇開啟緩存來降低 TiDB 生成執行計劃的開銷 。
●使用 EXPLAIN 語句查看執行計劃執行計劃由一系列的算子構成 。和其他數據庫一樣,在 TiDB 中可通過 EXPLAIN 語句返回的結果查看某條 SQL 的執行計劃 。
目前 TiDB 的 EXPLAIN 會輸出 5 列 , 分別是:id,estRows , task,access object,operator info 。執行計劃中每個算子都由這 5 列屬性來描述 , EXPLAIN結果中每一行描述一個算子 。每個屬性的具體含義如下:
京東云TiDB SQL優化的最佳實踐

文章插圖
● EXPLAIN ANALYZE 輸出格式和 EXPLAIN 不同 , EXPLAIN ANALYZE 會執行對應的 SQL 語句,記錄其運行時信息,和執行計劃一并返回出來,可以視為 EXPLAIN 語句的擴展 。EXPLAIN ANALYZE 語句的返回結果中增加了 actRows, execution info,memory,disk 這幾列信息:
京東云TiDB SQL優化的最佳實踐

文章插圖
舉個例子如下:
京東云TiDB SQL優化的最佳實踐

文章插圖
從上述例子中可以看出,優化器估算的 estRows 和實際執行中統計得到的 actRows 幾乎是相等的,說明優化器估算的行數與實際行數的誤差很小 。同時 IndexLookUp_10 算子在實際執行過程中使用了約 9 KB 的內存 , 該 SQL 在執行過程中,沒有觸發過任何算子的落盤操作 。
SQL優化案例最佳實踐案例一:索引的錯誤選擇導致SQL變慢的優化實踐場景:數據庫遷移到TiDB,SQL在MySQL運行不到1S,在TiDB運行超過30S
SQL執行計劃如下:
京東云TiDB SQL優化的最佳實踐

文章插圖
execution info列,有該執行計劃的時間 , 這個SQL的表的連接順序,要從最里面的循環開始看,如下圖 , m,d是最先開始進行連接的:
京東云TiDB SQL優化的最佳實踐

推薦閱讀