You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基础查询未利用number_int索引的性能优化咨询

针对block表查询性能的优化建议

1. 换用更高效的查询逻辑

你要找的是number_int在(1999999, 2999999)区间内的最大值,完全不需要先筛选再排序取limit 1。直接使用MAX()聚合函数,数据库可直接利用索引快速定位目标值,彻底绕开全表扫描和排序步骤:

SELECT MAX(number_int) FROM block WHERE number_int > 1999999 AND number_int < 2999999;

2. 强制数据库使用索引

如果优化器仍选择全表扫描,可以通过索引提示强制指定使用目标索引。不同数据库语法略有差异,以下是两种常见数据库的写法:

  • PostgreSQL 版本:
EXPLAIN ANALYZE SELECT number_int FROM block 
WHERE number_int > 1999999 AND number_int < 2999999 
ORDER BY number_int DESC LIMIT 1
USING INDEX number_int_index;
  • MySQL 版本:
EXPLAIN ANALYZE SELECT number_int FROM block 
FORCE INDEX (number_int_index)
WHERE number_int > 1999999 AND number_int < 2999999 
ORDER BY number_int DESC LIMIT 1;

3. 更新表统计信息

从查询计划可以看到,预估行数仅1000,但实际扫描了19万多行,这说明数据库的统计信息严重过时,导致优化器误判执行成本。执行以下命令更新统计信息:

  • PostgreSQL:ANALYZE block;
  • MySQL:ANALYZE TABLE block;

4. 检查索引有效性

索引可能因异常情况失效,先确认索引状态:

  • PostgreSQL:
SELECT indexname, indisvalid FROM pg_indexes WHERE tablename = 'block' AND indexname = 'number_int_index';

若返回的indisvalid为f,重建索引:

DROP INDEX number_int_index ON block;
CREATE INDEX number_int_index ON block (number_int);
  • MySQL:
SHOW INDEX FROM block WHERE Key_name = 'number_int_index';

若索引状态异常,同样执行删建索引操作。

5. 分布式场景额外优化

查询计划中出现Remote Filter,说明该表可能是远程表或分库分表结构,需额外注意:

  • 确保所有远程节点/分片上都已创建number_int_index
  • 调整分片键设计,让过滤条件能命中尽可能少的分片,缩小扫描范围

内容的提问来源于stack exchange,提问作者Brahian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:15:29