索引命中次数统计

PolarDB支持查看数据库中索引命中情况。PolarDB的索引命中统计功能能够精准记录并展示每个表中索引的使用情况,为数据库性能优化提供了强有力的数据支撑。通过深入分析索引的命中率和使用频率,您可以直观评估现有索引的有效性,并准确判断是否需要调整索引策略或新增索引,从而显著提升查询性能。

前提条件

集群版本需为PolarDB MySQL8.0.2版本且修订版本为8.0.2.2.29及以上。

获取方式

索引命中统计信息可以通过如下系统视图进行查询:

SELECT * FROM INFORMATION_SCHEMA.POLAR_INDEX_STATISTICS;

参数说明

字段名

说明

TABLE_SCHEMA

索引所属的数据库名称。

TABLE_NAME

索引所属的表名称。

INDEX_NAME

索引的名称(若为PRIMARY,表示主键索引)。

PLAN_HIT

执行计划中累计选择当前索引的次数(优化器决策使用该索引的统计值)。

EXECUTION_HIT

执行阶段中累计使用当前索引的次数(实际执行时遍历索引的次数)。

ROWS_READ

执行阶段通过当前索引累计扫描的数据行数(反映索引的实际数据访问量)。

示例

SELECT * FROM INFORMATION_SCHEMA.POLAR_INDEX_STATISTICS WHERE TABLE_SCHEMA = 'index_hit' AND TABLE_NAME LIKE 't%' ORDER BY TABLE_NAME, INDEX_NAME;

查询结果如下:

+--------------+------------+------------+---------------+---------------+------------+
| TABLE_SCHEMA | TABLE_NAME | INDEX_NAME | PLAN_HIT      | EXECUTION_HIT | ROWS_READ  |
+--------------+------------+------------+---------------+---------------+------------+
|index_hit     | t1         | ab         | 2             | 2             | 153        |
|index_hit     | t2         | a          | 1             | 1             |   6        |
+--------------+------------+------------+---------------+---------------+------------+

关键指标说明

PLAN_HIT的语义说明

在数据库查询优化过程中,系统会记录并维护索引的使用统计信息。具体而言,每当SQL查询语句被解析并生成执行计划时,查询优化器会根据成本估算模型选择最优的访问路径。如果优化器判定使用某个特定索引能够提供最优的查询性能,那么该索引对应的PLAN_HIT计数器就会自动递增。

EXECUTION_HIT的语义说明

每当遍历一次索引时,该计数值就会递增1。在多表嵌套循环连接(Nested Loop Join)场景中,非驱动表(右表)索引的EXECUTION_HIT值表示该表的索引被驱动表(左表)所触发的扫描次数。

ROWS_READ/EXECUTION_HIT比值

在数据库查询优化中,每次使用索引时平均扫描的行数是衡量索引效率的关键指标之一。该数值直观反映了索引的过滤性能:

  • 数值越小,表明索引的筛选效果越精准,能够快速定位目标数据。

  • 数值较高,则提示索引的选择性可能不足,无法有效缩小数据范围,可能导致查询性能下降。此时,建议结合实际的业务场景和查询需求,重新评估索引设计,例如优化索引字段组合、调整索引类型或引入覆盖索引等策略,以提升查询效率并降低资源消耗。

场景说明

多节点集群的索引命中统计

在多节点集群环境中,查询默认会被随机分发到任意可用节点上执行。您可以通过以下两种方式中其中一种来强制指定查询索引命中统计的执行节点。

按节点角色指定

  • 强制主节点执行 添加/*FORCE_MASTER*/提示,确保查询在主节点(读写节点)执行:

    /*FORCE_MASTER*/ SELECT * FROM INFORMATION_SCHEMA.POLAR_INDEX_STATISTICS;
  • 强制只读节点执行 添加/*FORCE_SLAVE*/提示,限制查询在只读节点执行:

    /*FORCE_SLAVE*/ SELECT * FROM INFORMATION_SCHEMA.POLAR_INDEX_STATISTICS;

按节点ID精准指定

通过/*force_node='节点ID'*/提示,直接指定目标节点执行(适用于调试或定向分析场景):

/*force_node='pi-bpxxx'*/ SELECT * FROM INFORMATION_SCHEMA.POLAR_INDEX_STATISTICS;

统计信息未持久化

INFORMATION_SCHEMA.POLAR_INDEX_STATISTICS视图提供的是基于内存的索引统计信息,这些数据不具备持久化存储特性。当数据库集群发生重启时,所有统计计数将被重置为零,并重新开始累积。因此,该视图所展示的数据仅反映自当前集群启动以来的累计统计值。

并发访问下的准确性

出于性能优化的考虑,当前索引命中统计信息在实现上采用了无锁设计。在高并发场景中可能导致索引命中统计数据存在微小误差。因此,该统计适用于趋势分析和性能优化参考,不适用于对数据一致性要求严格的精确计数场景。