我有一个表,我需要根据4列a,b,c,d进行查询 最常见的查询将是同时基于所有4列的选择,但是我需要能够快速搜索单独拍摄的每个列,或者它们的组合(例如a& b,a& d, b& c& d等等)。 我要为每个组合创建一个索引吗?或者最好只有一个& b& c& d的索引,一个用于a,一个用于b,一个用于c,一个用于d?在最后一种情况下,例如仅匹配& b的查询将加速,因为a和a都有索引?
答案 0 :(得分:1)
如果要满足索引的所有组合,则需要以下内容:
(a, b, c, d)
(a, b, d)
(a, c, d)
(a, d)
(b, c, d)
(b, d)
(c, d)
d
您不需要其他组合,因为索引的任何前缀也是索引。第一个索引将用于仅测试a
,a&b
,a&b&c
的查询,因此您不需要这些组合的索引。
您是否真的需要所有这些索引取决于您拥有多少数据。只有每列上的索引可以充分缩小搜索范围,以至于您不需要对组合进行索引,这是可能的。唯一真正的方法是对应用程序的性能进行基准测试。索引占用磁盘空间和内存,因此尝试创建所有可能的索引可能会导致其自身的问题;你需要确定是否需要足够强大。
答案 1 :(得分:0)
需要注意的一点是,“范围”仅作为索引中的最后一项使用:
WHERE x=2 AND y>5 -- INDEX(x,y) is useful; INDEX(y,x) only uses `y`
WHERE x=2 AND y BETWEEN 11 AND 22 -- ditto
WHERE x=2 AND s LIKE 'foo%' -- ditto
另一件事:“标志”(真/假等)自行索引是无用的。它们在组合中可能有些用处:
WHERE published=1 AND ...
另外,订单问题在INDEX
,而不在WHERE
:假设您有INDEX(a,b)
:
WHERE a=1 AND b=2 -- good index
WHERE b=2 AND a=1 -- equally good
WHERE a=1 -- the index is good
WHERE b=2 -- the index is useless
如果某个列始终是一个范围(例如日期),则会变得更加混乱。为了获得最佳索引,这里需要两个索引:
WHERE d BETWEEN ... -- needs INDEX(d)
WHERE a=1 AND d BETWEEN ... -- needs INDEX(a,d)
所以,我可能会这样做:
More了解索引创建。