AnalyticDB MySQL版的SQL诊断功能可以对SQL查询的Query、Stage和算子(Operator)级别的信息分别进行统计,再在统计信息的基础上进行诊断并提供调优建议。本文介绍如何查看和分析Query级别诊断结果。

诊断结果类型

说明 查看Query级别诊断结果的方法,请参见查看诊断结果

查询返回客户端的数据量较大

  • 问题
    大量数据返回到客户端会导致慢查询,还会占用部分网络前端资源。
    说明 您可以在查询详情页面的查询属性区域查看返回数据的信息。查看方法,请参见查看查询属性
  • 建议
    • 减少直接返回到客户端的数据量。例如您可以在查询时增加LIMIT关键字或增加查询的过滤条件。
    • 通过外表将数据导出至其他系统(例如OSS。详细操作步骤,请参见通过外表将数据导出到OSS)来减少返回到客户端的数据量。

查询消耗的内存资源较大

  • 问题
    查询消耗了大量内存,可能导致其他查询无法执行、执行变慢甚至影响到AnalyticDB MySQL版集群整体的稳定性。
    说明 您可以在查询详情页面的查询属性区域查看峰值内存信息。查看方法,请参见查看查询属性
  • 建议

    先定位查询消耗较大内存的原因,再通过AnalyticDB MySQL版SQL诊断中的执行计划找到消耗内存较多的Stage或者算子,更多详情,请参见消耗内存的慢查询使用执行计划分析查询

查询生成的Stage个数较多

  • 问题
    查询生成的Stage个数较多,会占用较多的网络资源,并且提升系统处理的复杂度,对集群整体稳定性有一定风险。
    说明 更多关于Stage的信息,请参见执行计划的要素
  • 建议
    • 在数据写入AnalyticDB MySQL版集群前,通过提前联表来减少集群中的表个数。
    • SQL中的Join数量越多,AnalyticDB MySQL版为查询生成的Stage数量越多。因此,您可以通过优化SQL减少Join数量,来减少因查询生成的Stage个数。
    • 使用物化视图进行查询时,AnalyticDB MySQL版能通过复用Stage来减少因查询生成的Stage数量。更多关于物化视图的详情,请参见物化视图

查询读取的数据量较大

  • 问题
    查询读取的数据量较大,会占用较多的磁盘IO资源,影响其他查询或者数据的写入过程。
    说明 您可以在查询详情页面的查询属性区域查看扫描数据的信息。查看方法,请参见查看查询属性
  • 建议

    先找到读取数据量较大的Stage以及相关的表扫描算子(TableScan)。您可以在AnalyticDB MySQL版SQL诊断的Stage层或算子层执行计划中的统计信息区域查看对应Stage扫描行数扫描量,或TableScan算子的输入行数输入大小来判断Stage和TableScan算子的扫描数据量。更多详情,请参见Stage统计信息算子统计信息

    找到扫描数据量较大的表扫描算子后,您可以考虑如下方式进行调优:
    • 在查询中增加AND过滤条件。
    • 调整已有的过滤条件,减少过滤后的数据量。
    • 检查是否存在没有下推的过滤条件。若存在,请参见过滤条件没有下推中的建议进行优化。