mysql:多索引建议

时间:2017-05-31 19:51:08

标签: mysql performance select indexing insert

我有一个表,我需要根据4列a,b,c,d进行查询 最常见的查询将是同时基于所有4列的选择,但是我需要能够快速搜索单独拍摄的每个列,或者它们的组合(例如a& b,a& d, b& c& d等等)。 我要为每个组合创建一个索引吗?或者最好只有一个& b& c& d的索引,一个用于a,一个用于b,一个用于c,一个用于d?在最后一种情况下,例如仅匹配& b的查询将加速,因为a和a都有索引?

2 个答案:

答案 0 :(得分:1)

如果要满足索引的所有组合,则需要以下内容:

(a, b, c, d)
(a, b, d)
(a, c, d)
(a, d)
(b, c, d)
(b, d)
(c, d)
d

您不需要其他组合,因为索引的任何前缀也是索引。第一个索引将用于仅测试aa&ba&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)

所以,我可能会这样做:

  • 制作a,b,c,d的所有2列组合 - 如果“范围”中不涉及任何内容,则这将是6种组合。我肯定会改变哪个col开始索引:ab,bc,cd,da,ac,db
  • 启用slowlog以查看未正确索引的内容。
  • 记录人们使用的实际组合。某些组合将很少使用。摆脱无用的索引。

More了解索引创建。