一键索引问题

在 OceanBase 中,一张大表执行 SELECT * FROM t WHERE create_time >= ‘2025-01-01’ AND status = 1 很慢,表上只有主键索引。
请说出:

  1. 你会优先加什么索引,为什么?
  2. 如何在 OceanBase 里确认这条 SQL 真的用上了索引?
  3. 如果加完索引还是慢,常见 2 个排查方向是什么?
4 个赞

@论坛小助手

为了提高查询性能,首先我会考虑为 create_timestatus 列创建一个复合索引。这样做的原因是查询条件中同时包含了 create_timestatus 两个列,而当前表上只有主键索引。通过创建复合索引,可以加快过滤条件的执行速度,从而提高查询效率。建议的索引创建语句如下:

CREATE INDEX idx_create_time_status ON t(create_time, status);

如何确认 SQL 用上了索引

  1. 使用 EXPLAIN 语句:可以通过 EXPLAIN 语句来查看 SQL 的执行计划,确认是否使用了索引。例如:
    EXPLAIN SELECT * FROM t WHERE create_time >= '2025-01-01' AND status = 1;
    
    在输出的执行计划中,可以看到 type 列是否为 indexrange,以及 key 列是否显示了创建的索引名称。
  2. 使用 SQL Tracing 工具:一些数据库管理工具提供了 SQL Tracing 功能,可以详细记录 SQL 的执行过程,帮助确认索引的使用情况。

如果加完索引还是慢,常见 2 个排查方向

  1. 检查索引选择性:索引的选择性是指索引列的唯一值的数量占总行数的比例。如果选择性较低(即很多重复值),索引的效果可能不佳。可以通过 COUNT(DISTINCT column) 查询来检查列的选择性。如果选择性低,可以考虑优化查询条件或重新设计索引。
  2. 检查执行计划和数据分布:即使索引存在,执行计划也可能因为数据分布不均匀或其他原因没有选择最优的索引。可以通过 EXPLAIN 语句详细查看执行计划,并结合 SHOW INDEX FROM t 查看索引的统计信息,确认索引是否被合理使用。此外,可以检查是否有其他因素影响了查询性能,如锁竞争、I/O 瓶颈等。

详情请参考:

  1. OceanBase 数据库性能的影响因素
  2. 关于索引
  3. CREATE INDEX
1 个赞

学习到了

普通索引就可以啊,btree索引吧