全部产品
Search
文档中心

云原生数据库 PolarDB:自动无感提速(AutoIndex)

更新时间:Jun 05, 2026

PolarDB MySQL版列存索引(IMCI)为您提供自动列存索引提速功能,帮助您自动无感地提升慢SQL的查询速度。

功能概述

PolarDB MySQL版的列存索引(IMCI)技术专为OLAP场景下的大数据量复杂查询设计。通过列存索引,PolarDB MySQL版可以实现实时事务处理与实时数据分析的一体化能力,成为一站式的HTAP数据库解决方案。

image

在传统使用方式中,若要对慢查询涉及的表进行加速,您需要手动通过CREATE TABLEALTER TABLE在表的COMMENT字段中添加COLUMNAR=1来创建列索引。当SQL模板数量众多、逻辑复杂时,手动方式效率较低。

自动列存索引提速功能(AutoIndex)可根据慢查询情况自动对目标表添加列索引,从而加速查询,无需您手动操作。

技术背景

AutoIndex是一种基于自动添加索引来调优SQL性能的技术手段。对于行存索引,业界已有充分的研究和商业落地案例(如Oracle、SQL Server等),通常从谓词(Predicate)、排序(Order By)或连接(Join)等角度,分析可能需要添加的二级索引,并在假设创建该索引后重新计算代价,选择可显著降低查询代价的索引进行创建。

在列索引领域,AutoIndex已被应用到Redshift、Snowflake、Databricks、Heatwave等系统中。典型的自动化手段包括:

  • 自动Load/Unload:根据查询执行情况自动创建列索引并加速慢查询;对于不常用或占用资源过多的列索引自动删除,减少空间消耗。

  • 自动Encode:根据每列数据分布自动选择最优的编码算法,进一步压缩存储空间。

  • 自动选取Distribute Key:使数据在MPP场景下分布更均衡,减少数据倾斜,同时优化分布式GroupBy与Join的数据Shuffle。

  • 自动选取Sort Key:结合常用谓词或连接、排序列来加速查询过滤或排序。

在IMCI中自动创建列索引比创建行索引的代价更低,容错性也更高,原因如下:

  • 写入影响更小:行存索引过多会显著影响主节点写入性能,而IMCI在主节点上并不物化列存数据。新增列索引后,只需通过Redo将写入操作同步到列存索引只读节点,对写入性能几乎不造成影响。

  • 更高压缩率:列索引一般能达到3~5倍的压缩率,新增索引在存储空间上的开销相对更小。

  • 对业务影响有限:无锁高效的数据结构采集SQL跟踪信息,以及使用Nonblock DDL(非阻塞DDL)降低对业务的干扰。

实现原理

慢查跟踪与DDL语句生成

集群各节点使用SQL Trace功能采集慢查询,对符合条件的SQL自动生成创建列索引的DDL语句。具体流程如下:

  1. SQL Trace:以SQL模板为键,采用MySQL官方的无锁哈希表跟踪和记录SQL执行信息,可适配高并发、海量SQL模板场景。在Sysbench测试场景下,SQL Trace对数据库性能的影响不超过3%。

  2. 触发条件:当某个慢查询的扫描行数达到设定阈值时,AutoIndex会生成给相应表添加列索引的DDL语句。

  3. 低开销设计:为避免重复解析SQL、打开表(open table)以及获取MDL锁,AutoIndex会直接使用已缓存的THD(Thread Handler)的table list,几乎不额外增加系统负担。

您可以直连至各节点,查询information_schema.imci_autoindex系统表,了解已追踪并生成DDL语句集合的慢查询信息。示例如下:

SELECT * FROM information_schema.imci_autoindex

结合information_schema.sql_sharing可获取更详细的SQL执行信息:

SELECT *
FROM information_schema.imci_autoindex autoindex, information_schema.sql_sharing share
WHERE autoindex.sql_id = share.sql_id
  AND share.type = 'SQL'

慢查收集聚合与DDL语句执行

集群中的列存索引只读节点(若有多个,则其中一个担任Leader角色)会收集并汇总各节点上存在列索引推荐的慢查询,并按执行时间倒序排序,依次执行推荐的DDL语句,直至达到单轮可执行的DDL数量阈值。

  • Instant DDL

    添加列索引的操作在主节点是Instant DDL,只需修改数据字典,并不会在主库做实际数据改动。对应的Redo会复制到列存索引只读节点,由后者在后台构建列索引。

  • Nonblock DDL(非阻塞DDL)

    普通DDL在等待获取MDL-X锁期间会阻塞新事务进入。而Nonblock DDL在获取锁失败时,会先允许新事务进入,再不断重试获取锁。对于AutoIndex场景,DDL并非紧急操作,一旦本轮失败,可在下轮自动调度中继续尝试。

    您可以通过集群地址查询information_schema.imci_autoindex_executed系统表,查看最近执行成功的列索引推荐语句及关联慢查询(最多保留128条记录)。

  • 调度与执行限制

    • 默认情况下,轮次间隔为1分钟,每轮最多执行5条DDL语句。

    • 未在本轮被覆盖的列索引需要等待后续慢查询再次命中才能被重试。

    • 列存索引只读节点在构建列索引时会受资源管控,虽然会引起资源指标上升,但不会打满节点资源。

    • 本轮次列索引在列存索引只读节点上构建完成后,才会开始调度下一轮次。

列索引生效与使用

为充分发挥AutoIndex效果,推荐将列存索引只读节点挂在集群地址下,开启行列自动分流。在真实业务流量回放过程中,慢查询会触发AutoIndex创建列索引。当列存索引只读节点完成索引构建后,行列自动分流机制可根据查询代价将相关查询路由到列存索引只读节点,从而获得加速效果。

如果业务流量直连普通只读节点,则在列索引创建完成后,可手动将流量切换到列存索引只读节点。列索引的状态查询、分流策略等信息,请参见列存索引常见问题

测试效果

以下为基于TPC-H 100 GB测试集的示例。

说明

本文的TPC-H的实现基于TPC-H的基准测试,并不能与已发布的TPC-H基准测试结果相比较,本文中的测试并不完全符合TPC-H的所有要求。

  • 环境准备:每隔1分钟执行一遍22条TPC-H测试查询;集群地址开启HTAP优化行存/列存自动引流),行存并行度设为8(主要用于缩短测试时间)。

  • 测试结果:如下表所示,后续轮次的查询速度提升非常明显。在第一轮执行后半部分查询时(约第12条开始),AutoIndex已完成对大多数表的列索引创建,优化器自动将这部分查询路由至列存索引只读节点。

执行轮次

总时间(s)

行存计划/列存计划

提速效果

1

8293

10/12

-

2

118

1/21

约70倍

3

110

0/22

约75倍

功能优势

列存索引特性提供了一系列优势,使其在兼容性、性能和成本方面都有显著提升:

  • 100%兼容MySQL:支持MySQL所有数据类型,完全兼容MySQL协议。

  • 优秀的HTAP性能:分析场景性能普遍可以达到1~2个数量级的提升。

  • 行列混合存储,降低成本:行列存储保证事务一致性,列索引在某些查询场景性能更优,成本更低。

  • 自动提速操作简单:一键开启自动性能提升,无需复杂配置和调整。

  • 节约运维工作量:自动为慢查询创建列索引,减少手动慢查询优化工作。

  • 节约IT成本:无需为所有库和表创建列索引,只针对慢查询优化,节省内存和存储资源。

支持版本

  • 企业版集群,需满足以下条件:

    • 系列集群版

    • 数据库内核版本号:

      • MySQL 8.0.1,且内核小版本需为8.0.1.1.45.2及以上。

      • MySQL 8.0.2,且内核小版本需为8.0.2.2.27及以上。

  • 标准版集群,需满足以下条件:

    • CPU架构X86

    • 数据库内核版本号:MySQL 8.0.1,且内核小版本需为8.0.1.1.45.2及以上。

说明

如何查询集群版本,请参见查询版本号

注意事项

  • 多主集群(Limitless)系列Serverless集群不支持开启自动列存索引提速功能。

  • 开启自动列存索引提速功能后:

    • 添加的列存索引只读节点费用按普通计算节点规则计费

    • 系统将根据您的慢SQL自动创建列存索引(列存索引数据会占用一定的存储空间)。

    • 系统会采用SQL Trace功能记录慢SQL的历史执行情况,一般情况下会占用不超过3%的数据库节点性能。

  • 自动列存索引提速功能内部采用Nonblock DDL执行列索引添加动作,Nonblock DDL功能可以保证即使在无法获得MDL-X锁的情况下,依然允许新事务进入目标表,从而保证整个业务系统的稳定。 更多信息,请参见非阻塞DDL

开启自动列存索引提速

  1. 登录PolarDB控制台,在左侧导航栏单击集群列表,选择集群所在地域,并单击目标集群ID进入集群详情页。

  2. 基本信息页面,单击自动列存索引提速栏的开启按钮。

  3. 按照当前集群是否有列存索引只读节点,可以分为如下两种情况:

    • 当前集群已有列存索引只读节点时,在开启自动列存索引提速对话框,单击确定,即可开启自动列存索引提速。

    • 当前集群没有列存索引只读节点时,在开启自动列存索引提速对话框,单击确定,将跳转至添加列存索引只读节点页面。

      说明
      • 您可以在单击确定后立即添加列存索引只读节点,也可以后续手动添加列存索引只读节点

      • 开启自动无感提速后,当前集群应含有至少一个列存索引只读节点,否则即使自动列存索引提速开启状态,也不会提供加速服务。

      • 开启自动无感提速后,若您未添加列存索引只读节点,系统会采用SQL Trace功能记录慢SQL的历史执行情况,但不会创建列存索引。即无法提供加速服务。

关闭自动列存索引提速

  1. 登录PolarDB控制台,在左侧导航栏单击集群列表,选择集群所在地域,并单击目标集群ID进入集群详情页。

  2. 基本信息页面,单击自动列存索引提速栏的关闭按钮。

  3. 关闭自动列存索引提速对话框,单击确定,即可关闭自动列存索引提速。

说明

关闭自动列存索引提速后,仅仅是关闭了自动列存索引提速功能的相关参数,列存索引只读节点及其相关数据将继续保留。如果您不再需要保留列存索引只读节点或其上的列存索引,可以在控制台中删除列存索引只读节点,或者通过SQL语句删除列存索引