不确定答案:表tb1上有索引i1(c1,c2,c3),则以下查询语句使用索引i1扫描时的扫描范围是:SELECT 1 FROM tb1 WHERE C1>? AND C2>? AND c3=?

表tb1上有索引i1(c1,c2,c3),则以下查询语句使用索引i1扫描时的扫描范围是:SELECT 1 FROM tb1 WHERE C1>? AND C2>? AND c3=?

A. c1>?AND c2>?AND c3=?

B. c3=?

C. c1>?AND c3=?

D. c1>?

1 个赞

这道题考察的是数据库联合索引的最左前缀原则

对于联合索引 i1(c1, c2, c3) ,B+树的数据是按照 c1 → c2 → c3 的顺序依次排序存储的。

我们来分析一下查询条件 WHERE C1>? AND C2>? AND c3=?

  1. C1>?(范围查询) :因为 C1 是索引的第一列,数据库可以直接定位到满足 C1>? 的起始位置。
  2. C2>?(范围查询) :在 C1 确定的前提下,数据会按照 C2 排序。但由于 C1 本身是一个范围(而不是一个固定的值),数据库无法在跨越多个 C1 值的情况下,继续利用索引有序性去过滤 C2 的范围。因此,索引的扫描到这里就“断”了,C2 的条件只能在扫描出 C1 的结果后进行过滤。
  3. c3=?(等值查询) :同理,由于前面的 C2 已经使用了范围查询,破坏了索引的连续性,c3 也无法使用索引进行查找或排序。

因此,这个查询在使用索引 i1 时,实际能利用到的扫描范围 仅仅只有第一列的范围条件。

正确答案是:D. c1>?

给我点个采纳呗!

正确答案:D. c1>?
索引 i1(c1, c2, c3) 是一个联合索引,遵循最左匹配原则:
索引的匹配是从最左列 c1 开始,依次向右匹配。
当遇到 ** 范围查询(>、<、BETWEEN 等)** 时,该列及后续列的索引匹配会被 “截断”。

A 。索引扫描范围由c1>?决定,c2>?和c3=?作为过滤条件。

点赞

1 个赞