如果第二列对于第一列中的每个条目总是只有几个条目很长,那么多列索引通常是否值得?
Is a multi-column index generally worth it if the second column will always only have a few entries long for each entry in the first column?
如果我在 table 中有两列,并且我计划对这两列进行大量查询(通常建议创建多列索引),但我也知道每个唯一的第一列中的值在第二列中只有大约 3 到 5 个值,与仅在第一列上有索引相比,多列索引是否仍然值得?假设我不关心创建索引的成本,我对多列索引比仅第一列的索引提高查询速度的程度非常感兴趣。
问题是多列索引是否可以覆盖查询或至少覆盖 where
子句(假设您的查询指的是 where
子句中的过滤)。
总的来说,答案是肯定的。考虑如下所示的数据:
x y datapage
a 1 datapage_1
a 2 datapage_2
a 3 datapage_3
b 1 datapage_4
. . .
如果您的查询是:
select x, y
from t
where x = 'a' and y = 2;
然后,在没有索引的情况下,数据库必须扫描所有数据页以找到匹配的行。
仅在 x
上建立索引,数据库可以找到所有 "a" 值,但它仍然必须加载三个数据页才能获得 y
值。
在x
和y
上都有索引,数据库可以直接到"datapage_2"。
如果我在 table 中有两列,并且我计划对这两列进行大量查询(通常建议创建多列索引),但我也知道每个唯一的第一列中的值在第二列中只有大约 3 到 5 个值,与仅在第一列上有索引相比,多列索引是否仍然值得?假设我不关心创建索引的成本,我对多列索引比仅第一列的索引提高查询速度的程度非常感兴趣。
问题是多列索引是否可以覆盖查询或至少覆盖 where
子句(假设您的查询指的是 where
子句中的过滤)。
总的来说,答案是肯定的。考虑如下所示的数据:
x y datapage
a 1 datapage_1
a 2 datapage_2
a 3 datapage_3
b 1 datapage_4
. . .
如果您的查询是:
select x, y
from t
where x = 'a' and y = 2;
然后,在没有索引的情况下,数据库必须扫描所有数据页以找到匹配的行。
仅在 x
上建立索引,数据库可以找到所有 "a" 值,但它仍然必须加载三个数据页才能获得 y
值。
在x
和y
上都有索引,数据库可以直接到"datapage_2"。