MySQL二级索引回表查询操作通常需要扫描两次B-tree,影响查询效率。为解决此性能瓶颈,PolarDB-X推出了Guess Primary Key Page No(GPP)功能。该功能通过优化索引回表路径,直接定位到主键所在的数据页,从而大幅提升回表查询性能,在特定场景下性能提升可超过50%。
前提条件
您的实例需满足以下版本要求:
实例系列:标准版或企业版。
引擎版本:MySQL 8.0。
存储节点版本:
xcluster8.4.19-20240731
及以上版本,即2024-07-31发布的版本及之后版本。
计费说明
Guess Primarykey Pageno(GPP)能力本身是免费的。然而,Guess Primarykey Pageno(GPP)在每个二级索引记录上会增加4个字节。对于绝大多数业务表而言,这部分存储空间的增加通常低于5%,但仍会增加相应的存储费用。
注意事项
实例版本:由于GPP涉及底层存储结构变动,开启并使用了GPP的实例无法降级至不支持GPP的老版本。
存量索引处理:对于已存在的二级索引,在开启GPP后,它们不会自动具备GPP能力。您可以通过以下方式重建索引,以使其具备GPP能力。
创建新索引:
ALTER TABLE ... ADD INDEX idx_new ...;
更换索引名:
ALTER TABLE ... RENAME idx TO idx_old, RENAME idx_new TO idx;
删除原索引:
ALTER TABLE ... DROP INDEX idx_old;
表与索引类型限制:GPP不适用于临时表、系统表、压缩表、全文索引以及空间索引。
开启GPP能力
PolarDB-X实例已默认开启GPP能力。若您需要调整GPP能力的开关,可前往PolarDB分布式版控制台,在目标集群的 页面的存储层页签中,调整参数opt_index_format_gpp_enabled
的值。此操作无需重启实例,即时生效。
将参数
opt_index_format_gpp_enabled
的值修改为ON
,创建表或者新建二级索引时默认创建具备GPP能力的二级索引。将参数
opt_index_format_gpp_enabled
的值修改为OFF
,创建表或者新建二级键索引时默认创建与MySQL社区保持一致的普通二级索引形式。
GPP性能测试
由于Sysbench等标准压测工具在只读场景(如oltp_read_only
)中默认使用主键进行查询,这样的查询方式无法触发回表。因此,在测试过程中将查询条件从主键(如id
)更改为二级索引键(如k
),以模拟真实的回表查询场景,从而准确评估GPP带来的性能提升。下表展示了GPP相较于未开启GPP的PolarDB-X实例在QPS上的提升率。可以看出,GPP在回表查询场景中表现出显著优势,特别是在range=100的大范围场景下,查询性能的提升可达50%以上。