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

带WHERE子句的MAX查询与TOP1排序查询最优索引咨询

带WHERE子句的MAX查询与TOP排序查询的最优索引方案

第一个查询的最优索引

针对以下SQL:

SELECT MAX(SomeINTvalue)
FROM tbTest
WHERE Filter1 = SomeVARCHAR32value

最优索引是复合覆盖索引,创建语句如下:

CREATE INDEX IX_tbTest_Filter1_SomeINTvalue ON tbTest (Filter1, SomeINTvalue);

原因:

  • 索引首列使用Filter1,匹配WHERE子句的过滤条件,数据库能快速定位到所有符合Filter1 = SomeVARCHAR32value的记录分组。
  • 第二列包含SomeINTvalue,形成覆盖索引——数据库无需回表查询原数据,直接从索引中就能获取最大值。由于索引是有序存储的,找到匹配分组后,直接取该组最后一条记录的SomeINTvalue就是最大值,无需扫描所有匹配行,对百万级数据的效率极高。

第二个查询的性能对比与最优索引

针对以下SQL:

SELECT TOP 1 
       SomeINTvalue
FROM tbTest
WHERE Filter1 = SomeVARCHAR32value
ORDER BY SomeINTvalue DESC

性能对比:

在拥有合适索引的前提下,这条语句的性能和第一个MAX查询几乎无差异。数据库查询优化器会将两者的执行逻辑优化为一致——都是快速定位到Filter1匹配的分组,直接获取最大的SomeINTvalue,不会有额外的性能开销。如果没有合适索引,TOP+ORDER BY可能会触发排序操作,此时性能不如MAX查询,但只要建对索引,两者效率持平。

最优索引:

和第一个查询的索引完全兼容,推荐创建:

CREATE INDEX IX_tbTest_Filter1_SomeINTvalue ON tbTest (Filter1, SomeINTvalue DESC);

或者使用升序索引(Filter1, SomeINTvalue)也可以——主流数据库(如SQL Server、MySQL)支持反向扫描索引,同样能高效处理ORDER BY SomeINTvalue DESC的TOP 1查询。指定DESC只是让索引排序更贴合查询需求,逻辑上没有本质差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 18:13:17