全部產品
Search
文件中心

Database Autonomy Service:SQL最佳化

更新時間:Mar 04, 2026

資料庫自治服務DAS提供SQL最佳化功能,自動輸出診斷結果、最佳化建議和預期最佳化收益,您可以根據診斷結果確認是否採納建議。本文介紹如何使用SQL最佳化功能。

前提條件

  • 資料庫引擎為:

    • RDS MySQL

      說明

      暫不支援RDS MySQL的基礎版和叢集版。

    • MyBase MySQL

    • PolarDB MySQL版

      說明

      暫不支援PolarDB MySQL版的單節點叢集(原單節點執行個體)。

    • PolarDB-X 2.0

      說明

      不支援大版本為5.4.13,小版本在[16415631,16504348]範圍內的PolarDB-X 2.0執行個體。查看PolarDB-X 2.0執行個體版本請參見查看和升級執行個體版本

    • MongoDB

  • 目標執行個體已經接入DAS,詳情請參見執行個體接入簡介

  • 目標執行個體的接入狀態為接入正常

功能限制

  • 不支援對使用X-Engine表的SQL進行診斷和最佳化。

  • PolarDB-X中,若通過 Prepared Statements 執行 SQL,慢日誌將分別記錄語句模板(如select * from test where a = ? and b = ?)和綁定參數(如 params: [1, 2])。由於該格式無法直接作為有效 SQL 執行,依賴原始語句的分析或最佳化能力可能受限。

在慢日誌分析頁面建立SQL可視化分析

本功能能夠以直觀的圖形化方式呈現複雜的SQL執行流程。通過圖形介面,您可以清晰地瞭解查詢的執行路徑、各節點的執行效率以及潛在的效能瓶頸,從而在慢SQL最佳化、上線前的代碼審查、自檢等情境中迅速定位問題並進行針對性最佳化。

重要

當前在慢日誌分析頁面進行SQL最佳化,僅支援RDS MySQL 5.6、5.7、8.0 版本PolarDB MySQL 5.6、5.7、8.0 版本執行個體。

  1. 登入DAS控制台

  2. 在左側導覽列中,單擊智能營運中心 > 執行個體監控

  3. 找到目標執行個體,單擊執行個體ID,進入目標執行個體詳情頁。

  4. 在左側導覽列中,單擊請求分析 > 慢日誌

  5. 慢日誌分析頁面:

    • 慢日誌統計頁簽,單擊目標SQL模板右側操作列的最佳化

    • 慢日誌明細頁簽,單擊目標SQL右側操作列的最佳化

  6. 在彈出窗中點擊建立計劃

  7. 選擇執行節點類型。

    • Standby節點(預設節點):當前執行個體的備庫節點,主要用於常規查詢分析。

    • 事發節點:實際執行 SQL 陳述式的業務節點,適用於問題定位與最佳化。

  8. 單擊確認建立,即可建立可視化執行計畫

可視化執行計畫詳解

重要
  • 可視化執行計畫反映的是目前時間點的執行情況,而非歷史執行記錄。

  • 由於 SQL 陳述式的複雜性,可視化矩陣會隨之變化。如果圖形內容較多,可使用縮放工具調整顯示比例或通過複位按鈕回到初始視圖。

可視化執行計畫中的執行順序為自下而上、自左向右,即最底層的節點為查詢的起始點,逐層向上展示資料的處理流程,直至最終的查詢結果輸出。如下圖所示:

節點顏色含義

  • 高效節點(綠色):表示高效的訪問方式,包括:systemconsteq_refrefref_or_nullindex_merge

  • 中等效率節點(黃色):表示次優的訪問方式,包括:fulltextunique_subqueryindex_subqueryrange

  • 低效節點(紅色):表示低效的訪問方式,優先最佳化對象,包括:allindex

節點展示說明

  • 上部:顯示節點類型(如TABLE_SCANINDEX_SCAN等)。

  • 左側:顯示開銷(Cost),為最佳化器評估的相對指標,綜合考慮 CPU、記憶體和磁碟 I/O 等因素。

  • 右側:顯示預估返回行數,協助評估資料處理量。

最佳化建議

優先關注並最佳化標記為紅色的低效節點,以顯著提升查詢效能。

術語與解釋

英文術語

中文釋義

技術解釋

QUERY_BLOCK

查詢塊

SQL語句的語義分割單元,每個獨立查詢或子查詢構成一個查詢塊,EXPLAIN輸出中通過select_id進行標識。

ATTACHED_SUBQUERIES

附著子查詢

通過EXISTS、IN、ANY等謂詞附加在WHERE、HAVING、ON子句中的子查詢,與主查詢存在邏輯依存關係。

CORRELATED_SUBQUERY

相互關聯的子查詢

引用外層查詢列的巢狀查詢,執行時需要綁定外部內容值,可能導致O(n²)複雜度。

NON_CORRELATED_SUBQUERY

非相互關聯的子查詢

完全自包含的子查詢,可獨立於外層查詢執行,通常被最佳化器提前計算並物化為常量。

MATERIALIZED_FROM_SUBQUERY

物化子查詢

MySQL 5.6+引入的最佳化策略,將子查詢結果持久化到記憶體暫存資料表中,通常與subqueryN格式的派生表關聯。

OPTIMIZED_AWAY_SUBQUERIES

最佳化消除的子查詢

經查詢重寫最佳化後完全移除的子查詢(如常量子查詢下推),不會出現在最終執行計畫中。

QUERY_SPECIFICATIONS

查詢規範結構

描述完整查詢的文法要素,包括SELECT列表、FROM子句、過濾條件等組件組成的完整語義單元。

SELECT_LIST_SUBQUERIES

SELECT列表子查詢

出現在投影列(SELECT欄位列表)中的標量子查詢,需確保每次迭代返回單個標量值。

INDEX_SCAN

索引掃描

使用B+樹索引進行資料訪問的模式,根據掃描方向可分為正序掃描或逆序掃描,可能包含回表操作。

TABLE_SCAN

全表掃描

當無可用索引或需要訪問超閾值比例資料時,最佳化器選擇掃描聚簇索引全頁的訪問方式,效能與表資料量成正相關。

ORDERING_OPERATION

結果集排序

使用顯式排序演算法(如filesort)對結果集進行ORDER BY操作,可能使用記憶體或磁碟臨時檔案。

NESTED_LOOP

嵌套迴圈串連

表串連演算法的最基礎實現,對外部表格的每行資料遍曆內部表的匹配行,在串連謂詞有效過濾時效率較高。

DUPLICATES_REMOVAL

結果去重

實現DISTINCT語義的操作方式,底層可能通過暫存資料表唯一索引或排序後過濾實現,成本取決於資料分布特徵。

WINDOWING_OPERATION

視窗Function Compute

對OVER()子句定義的資料視窗進行的分析Function Compute(如ROW_NUMBER、RANK),可能需要全量資料集排序。

TABLE

基表引用

執行計畫中直接存取的實體儲存體對象,包含表名、別名及存取方法(如const、system、range等)資訊。

在執行個體會話頁面進行SQL最佳化

重要

當前自建MySQL、MongoDB和RDS PostgreSQL資料庫執行個體不支援在執行個體會話頁面進行SQL最佳化。

  1. 登入DAS控制台

  2. 在左側導覽列中,單擊智能營運中心 > 執行個體監控

  3. 找到目標執行個體,單擊執行個體ID,進入目標執行個體詳情頁。

  4. 在左側導覽列中,單擊執行個體會話

  5. 執行個體會話地區,選中需要進行SQL最佳化的會話,單擊最佳化

  6. 在彈出的SQL診斷最佳化對話方塊中,查看SQL診斷結果。

    若您採納診斷建議,單擊頁面右上方的複製,並將最佳化後的SQL粘貼到資料庫用戶端或DMS上執行,若不採納診斷建議,可直接單擊取消結束診斷。

    說明

    DAS會根據SQL的複雜程度、對應表的資料量、資料庫負載等進行SQL診斷,診斷建議的返回時間可能會超過20秒。完成診斷後,SQL診斷引擎會給出診斷結果、最佳化建議和預期最佳化收益,您可以根據診斷結果確認是否採納建議。

查看SQL診斷歷史

  1. 登入DAS控制台

  2. 在左側導覽列中,單擊智能營運中心 > 執行個體監控

  3. 找到目標執行個體,單擊執行個體ID,進入目標執行個體詳情頁。

  4. 在左側導覽列中,單擊請求診斷歷史。查看當前執行個體的SQL診斷歷史(如SQL內容、診斷狀態、診斷時間、診斷結果等)。