数据库系统工程师 · 索引优化 · SQL查询

最左前缀、覆盖索引和索引失效怎么区分?

索引题最怕只背“索引能加快查询”。真正的考点往往更细:联合索引为什么看列顺序,覆盖索引为什么能减少回表,为什么给索引列套函数可能失效。这些词都和索引有关,但题干信号完全不一样。

数据库系统工程师专题 软考题库编辑部 持续更新

最左前缀看的是联合索引的列顺序

联合索引不是把几列随便捆在一起。它通常按定义顺序组织键值,查询条件如果能从最左侧列开始连续匹配,更容易利用这个索引。跳过前导列直接用后面的列,往往无法充分发挥联合索引作用。

比如有联合索引 (dept_id, status, create_time),查询 dept_id 和 status 通常更容易用上;如果只查 status,而没有 dept_id 条件,就要警惕不符合最左前缀。考试不一定考真实数据库优化细节,但会考这个基本判断。

考点核心判断题干信号
最左前缀联合索引从最左列开始连续匹配列顺序、前导列、组合索引
覆盖索引查询所需列都在索引里不回表、索引包含返回列
索引失效条件写法让索引难以有效利用函数、隐式转换、前置通配符
B+树索引适合范围查询和有序扫描多路平衡、叶子节点有序

覆盖索引的关键是“要查的列都在索引里”

覆盖索引不是索引范围更大,也不是所有联合索引都天然覆盖。它强调查询需要过滤和返回的列,都可以从索引中拿到,数据库就可能少一次回到数据行取数据的过程,也就是减少回表。

比如查询 SELECT user_id, user_name FROM user WHERE status = 1,如果索引里已经包含 status、user_id、user_name,就可能形成覆盖索引。可如果 SELECT 又取了一个索引外的大字段,就可能仍然需要回表。

老师式判断

先看 WHERE 条件用到哪些列。

再看 SELECT 返回哪些列。

如果这些列都能从索引里得到,才有覆盖索引的味道。

索引失效常常不是索引没建,而是条件写法不友好

很多索引失效题并不是问你有没有建索引,而是问 SQL 条件有没有破坏索引的有序性。比如在索引列上使用函数,数据库比较的是函数计算后的结果,可能无法直接利用原始字段的索引顺序。

日期查询是典型例子。与其写 DATE(create_time) = '2026-06-14',更常见的优化写法是 create_time >= '2026-06-14' AND create_time < '2026-06-15'。这样更有机会利用 create_time 上的索引范围扫描。

题干描述优先想到容易误选
联合索引跳过第一列最左前缀问题覆盖索引
查询列都在索引中覆盖索引索引失效
索引列被函数包住索引失效风险B+树结构
叶子节点有序、适合范围扫描B+树索引哈希索引

索引题按三步读题

第一步,看索引是什么结构或哪些列组成。第二步,看查询条件是否从联合索引最左列开始、有没有函数或隐式转换。第三步,看返回列是否都在索引里。这样读题,比看到“索引”两个字就选“提高查询速度”更可靠。

软考里的索引题通常不会要求你像数据库内核工程师一样分析执行计划,但会考你能不能把场景放到正确概念上。最左前缀、覆盖索引、回表、索引失效这几个词建议成组复习。

相关题目解析

下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。