AnalyticDB for MySQL的SQL诊断功能可以对SQL查询的Query、Stage和算子(Operator)级别的信息分别进行统计,再在统计信息的基础上进行诊断并提供调优建议。本文介绍如何查看和分析Query级别诊断结果。
诊断结果类型
说明 查看Query级别诊断结果的方法,请参见查看诊断结果。
查询返回客户端的数据量较大
查询消耗的内存资源较大
- 问题查询消耗了大量内存,可能导致其他查询无法执行、执行变慢甚至影响到AnalyticDB for MySQL集群整体的稳定性。说明 您可以在查询详情页面的查询属性区域查看峰值内存信息。查看方法,请参见查看查询属性。
- 建议
先定位查询消耗较大内存的原因,再通过AnalyticDB for MySQLSQL诊断中的执行计划找到消耗内存较多的Stage或者算子,更多详情,请参见消耗内存的慢查询和使用执行计划分析查询。
查询生成的Stage个数较多
- 问题查询生成的Stage个数较多,会占用较多的网络资源,并且提升系统处理的复杂度,对集群整体稳定性有一定风险。说明 更多关于Stage的信息,请参见影响查询性能的因素。
- 建议
- 在数据写入AnalyticDB for MySQL集群前,通过提前联表来减少集群中的表个数。
- SQL中的Join数量越多,AnalyticDB for MySQL为查询生成的Stage数量越多。因此,您可以通过优化SQL减少Join数量,来减少因查询生成的Stage个数。
- 使用物化视图进行查询时,AnalyticDB for MySQL能通过复用Stage来减少因查询生成的Stage数量。更多关于物化视图的详情,请参见物化视图。
查询读取的数据量较大
- 问题查询读取的数据量较大,会占用较多的磁盘IO资源,影响其他查询或者数据的写入过程。说明 您可以在查询详情页面的查询属性区域查看扫描数据的信息。查看方法,请参见查看查询属性。
- 建议
先找到读取数据量较大的Stage以及相关的表扫描算子(TableScan)。您可以在AnalyticDB for MySQLSQL诊断的Stage层或算子层执行计划中的统计信息区域查看对应Stage扫描行数、扫描量,或TableScan算子的输入行数和输入大小来判断Stage和TableScan算子的扫描数据量。更多详情,请参见Stage统计信息和算子统计信息。
找到扫描数据量较大的表扫描算子后,您可以考虑如下方式进行调优:- 在查询中增加AND过滤条件。
- 调整已有的过滤条件,减少过滤后的数据量。
- 检查是否存在没有下推的过滤条件。若存在,请参见过滤条件没有下推中的建议进行优化。