SQL优化

数据库自治服务DAS提供SQL优化功能,自动输出诊断结果、优化建议和预期优化收益,您可以根据诊断结果确认是否采纳建议。本文介绍如何使用SQL优化功能。

前提条件

  • 数据库引擎为:

    • 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实例版本请参见查看和升级实例版本

  • 目标实例已经接入DAS,详情请参见实例接入简介

  • 目标实例的接入状态为接入正常

功能限制

不支持对使用X-Engine表的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. 在弹出窗中点击创建计划

    image

  7. 选择执行节点类型。

    image

    • Standby节点(默认节点):当前实例的备库节点,主要用于常规查询分析。

    • 事发节点:实际执行 SQL 语句的业务节点,适用于问题定位与优化。

  8. 单击确认创建,即可创建可视化执行计划

    image

可视化执行计划详解

重要
  • 可视化执行计划反映的是当前时间点的执行情况,而非历史执行记录。

  • 由于 SQL 语句的复杂性,可视化矩阵会随之变化。如果图形内容较多,可使用缩放工具调整显示比例或通过复位按钮回到初始视图。

可视化执行计划中的执行顺序为自下而上、自左向右,即最底层的节点为查询的起始点,逐层向上展示数据的处理流程,直至最终的查询结果输出。如下图所示:

image

节点颜色含义

  • 高效节点(绿色):表示高效的访问方式,包括:systemconsteq_refrefref_or_nullindex_merge

  • 中等效率节点(黄色):表示次优的访问方式,包括:fulltextunique_subqueryindex_subqueryrange

  • 低效节点(红色):表示低效的访问方式,优先优化对象,包括:allindex

节点展示说明

image

  • 上部:显示节点类型(如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+树索引进行数据访问的模式,根据扫描方向可分为正序扫描(ASC)或逆序扫描(DESC),可能包含回表操作。

TABLE_SCAN

全表扫描

当无可用索引或需要访问超阈值比例数据时,优化器选择扫描聚簇索引全页的访问方式,性能与表数据量成正相关。

ORDERING_OPERATION

结果集排序

使用显式排序算法(如filesort)对结果集进行ORDER BY操作,可能使用内存或磁盘临时文件。

NESTED_LOOP

嵌套循环连接

表连接算法的最基础实现,对外部表的每行数据遍历内部表的匹配行,在连接谓词有效过滤时效率较高。

DUPLICATES_REMOVAL

结果去重

实现DISTINCT语义的操作方式,底层可能通过临时表唯一索引或排序后过滤实现,成本取决于数据分布特征。

WINDOWING_OPERATION

窗口函数计算

OVER()子句定义的数据窗口进行的分析函数计算(如ROW_NUMBER、RANK),可能需要全量数据集排序。

TABLE

基表引用

执行计划中直接访问的物理存储对象,包含表名、别名及访问方法(如const、system、range等)信息。

在实例会话页面进行SQL优化

重要

当前自建MySQL、MongoDBRDS PostgreSQL数据库实例不支持在实例会话页面进行SQL优化。

  1. 登录DAS控制台

  2. 在左侧导航栏中,单击智能运维中心 > 实例监控

  3. 找到目标实例,单击实例ID,进入目标实例详情页。

  4. 在左侧导航栏中,单击实例会话

  5. 实例会话区域,选中需要进行SQL优化的会话,单击优化

  6. 在弹出的SQL诊断优化对话框中,查看SQL诊断结果。

    若您采纳诊断建议,单击页面右上角的复制,并将优化后的SQL粘贴到数据库客户端或DMS上执行,若不采纳诊断建议,可直接单击取消结束诊断。

    说明

    DAS会根据SQL的复杂程度、对应表的数据量、数据库负载等进行SQL诊断,诊断建议的返回时间可能会超过20秒。完成诊断后,SQL诊断引擎会给出诊断结果、优化建议和预期优化收益,您可以根据诊断结果确认是否采纳建议。

    SQL诊断优化

查看SQL诊断历史

  1. 登录DAS控制台

  2. 在左侧导航栏中,单击智能运维中心 > 实例监控

  3. 找到目标实例,单击实例ID,进入目标实例详情页。

  4. 在左侧导航栏中,单击请求诊断历史。查看当前实例的SQL诊断历史(如SQL内容、诊断状态、诊断时间、诊断结果等)。