加快二级索引的回表查询性能-GPP

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能力。

    1. 创建新索引:ALTER TABLE ... ADD INDEX idx_new ...;

    2. 更换索引名:ALTER TABLE ... RENAME idx TO idx_old, RENAME idx_new TO idx;

    3. 删除原索引: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相较于未开启GPPPolarDB-X实例在QPS上的提升率。可以看出,GPP在回表查询场景中表现出显著优势,特别是在range=100的大范围场景下,查询性能的提升可达50%以上。

GPP Sysbench QPS提升率

常见问题

我的老版本实例升级后,存量表的二级索引会自动拥有GPP能力吗?

不会。GPP涉及底层存储结构的变更,您需要手动重建存量表的二级索引才能使其具备GPP能力

开启或关闭参数opt_index_format_gpp_enabled有风险吗?

没有风险。开启或关闭此参数是实例级别的动态操作,无需重启,对您的业务没有影响。它仅决定了后续新建的索引是否默认开启GPP能力。

开启GPP会产生额外成本或性能回退吗?

  • 成本:GPP会带来少量的存储成本增加(每个索引记录上增加4个字节),对于绝大多数业务表而言,这部分存储空间的增加通常低于5%。

  • 性能:GPP可能有丢失(miss)的概率,这主要是由于B-tree树形结构变化导致的。若GPP的丢失(miss)概率远大于命中(hit),那么GPP会带来回表性能的负提升,但根据实际生产环境数据来看,GPP的命中率能够保持在99%以上,在此命中率下,GPP可以带来回表查询性能的显著提升。

GPP支持哪些表和数据库模式?

无论是标准版还是企业版,均支持GPP。

企业版中,无论是分区表、单表还是广播表,亦或是DRDS模式或AUTO模式的数据库,均支持GPP。