PolarDB-X 的 XPlan 索引选择

💡 原文中文,约5900字,阅读约需14分钟。
📝

内容提要

本文介绍了PolarDB-X数据库的索引选择算法XPlan,通过将执行计划直接传输给数据节点执行,避免了索引选择的不准确性。文章详细介绍了XPlan的设计原理和流程,并提到了XPlan索引选择的优化和倾斜值问题的处理。通过优化XPlan索引选择,PolarDB-X显著降低了索引错选的概率。

🔎

延伸解读

XPlan的定位与适用边界

XPlan是PolarDB-X针对点查场景的优化机制,通过将执行计划直接下发给数据节点(DN)执行,避免CN与DN双重优化。但它并非必需能力,目前仅支持单表DQL,且只涵盖Scan、Filter和Project算子。这意味着复杂查询、多表关联或AP场景无法享受XPlan带来的性能提升,读者需明确其适用范围,避免误以为所有查询都能受益。

索引错选的两大根源与应对

XPlan索引错选主要源于基数估计错误和执行计划缓存下的倾斜索引问题。基数估计错误常因统计信息缺失、倾斜数据或关联列独立性假设导致,而计划缓存(Optimize Once)会让同一SQL模版复用执行计划,在数据分布不均时选错索引。PolarDB-X通过检测统计信息过期、过滤倾斜索引来规避,但无法根治,因此设计了回退机制作为兜底。

倾斜值判断的逻辑与局限

XPlan通过采样10万行数据判断索引前缀列组合是否存在倾斜:若某值频率大于5且频率/采样率大于1万,则视为倾斜,该索引不会被XPlan选用。这种方法能有效缓解Plan Cache导致的倾斜问题,但依赖采样的稳定性,且对复合主键等天然倾斜场景不做判断。文章也指出该逻辑仍有改进空间,稳定性需进一步增强。

回退机制与可观测性设计

当XPlan在Innodb上扫描的行数超过阈值时,CN会关闭当前SQL模版的XPlan并报警,12小时内不再启用。这一机制同样适用于仅依赖Plan Cache的数据库。此外,PolarDB-X支持explain execute查看DN物理索引,并在日志中记录XPlan使用的索引及扫描行数,便于排查问题。但需注意,回退机制可能导致explain execute与线上实际状态不一致。

❓

Q&A

XPlan索引选择的主要功能是什么?

XPlan索引选择通过直接传输执行计划给数据节点,避免了索引选择的不准确性,优化了点查场景的查询性能。

PolarDB-X如何处理索引选择中的基数估计错误?

PolarDB-X通过检测统计信息的过期和倾斜索引,禁用XPlan以避免基数估计错误,交由数据节点进行局部索引选择。

XPlan索引选择的优化效果如何?

经过优化后,XPlan索引错选的概率从5%降至0.1%,显著降低了选错索引的风险。

XPlan的设计考虑了哪些问题?

XPlan的设计考虑了基数估计错误和执行计划缓存下的倾斜索引问题,以提高索引选择的准确性。

PolarDB-X的执行计划缓存机制是怎样的?

PolarDB-X的执行计划缓存机制通过PlanCache和PlanManager管理执行计划,采用Optimize Once策略以减少优化器的开销。

XPlan索引选择的回退机制是什么?

XPlan的回退机制在发现索引选择错误时,会关闭当前SQL模版的XPlan并发出报警,确保系统稳定性。

🏷️

标签

➡️

继续阅读