阿里云 PolarDB 查询慢优化首选通过 DAS 智能诊断定位缺失索引,或使用 EXPLAIN 分析执行计划后添加覆盖索引。适用场景为读多写少的业务场景,风险边界在于新增索引可能增加写入开销且锁表期间影响业务。
先说结论:PolarDB 查询优化核心在于减少扫描行数,优先使用索引覆盖查询条件,必要时通过 Outline 固定执行计划。
- 先定位:通过慢查询日志或 DAS 控制台找出耗时最长的 SQL 语句。
- 先做:针对高频过滤字段创建联合索引,避免索引失效场景。
- 再验证:使用 EXPLAIN 确认 type 变为 ref 或 range,观察 Rows_examined 下降。
命令速用版
以下命令用于快速分析 SQL 执行路径和索引状态,直接在 PolarDB 客户端或 DMS 中执行。
EXPLAIN SELECT * FROM table_name WHERE column = 'value'; SHOW INDEX FROM table_name; ALTER TABLE table_name ADD INDEX idx_column (column);
若无法修改代码,可使用 Outline 功能强制指定执行计划,无需重启服务。
为什么会这样
PolarDB 查询慢通常是因为优化器选择了全表扫描而非索引扫描。PolarDB 基于共享存储架构,计算节点依赖统计信息生成执行计划,当数据分布变化或统计信息滞后时,优化器可能误判。
索引缺失会导致数据库读取大量无关数据块,增加 I/O 等待。此外,隐式类型转换、函数运算包裹字段、前缀模糊查询都会导致索引失效,迫使数据库进行全表扫描。
分步处理
第一步:定位慢 SQL。登录阿里云控制台,进入 PolarDB 实例详情页,点击“慢日志”或使用 DAS“智能诊断”功能,按执行耗时排序提取 Top 10 语句。
第二步:分析执行计划。对提取的 SQL 添加 EXPLAIN 前缀执行,重点关注 type 字段。若显示 ALL,表示全表扫描;若显示 index,表示全索引扫描,均需优化。
第三步:创建或调整索引。根据 WHERE 条件和 ORDER BY 字段创建联合索引,遵循最左前缀原则。若表数据量大,建议在业务低峰期执行 DDL,或使用 Online DDL 工具。
第四步:使用 Outline 固化计划。若 SQL 无法修改且索引已存在但未被使用,可在 DAS 中创建 Outline,绑定特定 SQL 与指定执行计划,防止计划回退。
怎么验证是否生效
执行优化后的 SQL,再次运行 EXPLAIN 命令,确认 type 字段变为 ref、range 或 const。检查 Rows_examined 数值,该数值应显著小于优化前。
在慢日志页面观察该 SQL 的平均执行耗时是否下降。若使用 Outline,可在 DAS“执行计划管理”页面查看绑定状态是否为“生效”。
常见坑
索引区分度低:在性别、状态等低基数字段上单独建索引,优化器可能仍选择全表扫描,建议将其放在联合索引末尾。
统计信息滞后:大批量导入或删除数据后,统计信息未更新会导致执行计划偏差,需手动执行 ANALYZE TABLE 更新统计信息。
隐式转换陷阱:查询条件字段类型与表定义不一致(如字符串加引号),会导致索引失效,需确保应用层参数类型与数据库定义匹配。
常见问题
加了索引为什么 EXPLAIN 还是显示 ALL?
可能因为查询条件触发了索引失效规则,如对索引列进行了函数运算或类型隐式转换。
PolarDB 的 Outline 功能会影响性能吗?
Outline 本身开销极小,主要用于稳定执行计划,避免因统计信息波动导致性能抖动。
在线添加索引会锁表吗?
PolarDB 支持 Online DDL,通常不会锁表,但长事务可能阻塞 DDL 完成,建议在低峰期操作。
参考来源
- 阿里云官方文档,PolarDB 性能优化概述,https://help.aliyun.com/product/42155.html
- 阿里云官方文档,DAS 数据库自治服务,https://help.aliyun.com/product/136905.html
- 阿里云官方文档,EXPLAIN 语法说明,https://help.aliyun.com/document_detail/32360.html