在 OceanBase 中,一张大表执行 SELECT * FROM t WHERE create_time >= ‘2025-01-01’ AND status = 1 很慢,表上只有主键索引。
请说出:
- 你会优先加什么索引,为什么?
- 如何在 OceanBase 里确认这条 SQL 真的用上了索引?
- 如果加完索引还是慢,常见 2 个排查方向是什么?
在 OceanBase 中,一张大表执行 SELECT * FROM t WHERE create_time >= ‘2025-01-01’ AND status = 1 很慢,表上只有主键索引。
请说出:
为了提高查询性能,首先我会考虑为 create_time 和 status 列创建一个复合索引。这样做的原因是查询条件中同时包含了 create_time 和 status 两个列,而当前表上只有主键索引。通过创建复合索引,可以加快过滤条件的执行速度,从而提高查询效率。建议的索引创建语句如下:
CREATE INDEX idx_create_time_status ON t(create_time, status);
EXPLAIN 语句来查看 SQL 的执行计划,确认是否使用了索引。例如:EXPLAIN SELECT * FROM t WHERE create_time >= '2025-01-01' AND status = 1;
在输出的执行计划中,可以看到 type 列是否为 index 或 range,以及 key 列是否显示了创建的索引名称。COUNT(DISTINCT column) 查询来检查列的选择性。如果选择性低,可以考虑优化查询条件或重新设计索引。EXPLAIN 语句详细查看执行计划,并结合 SHOW INDEX FROM t 查看索引的统计信息,确认索引是否被合理使用。此外,可以检查是否有其他因素影响了查询性能,如锁竞争、I/O 瓶颈等。详情请参考:
学习到了
普通索引就可以啊,btree索引吧