【发布时间】:2015-07-12 01:19:19
【问题描述】:
我有一个超过 200,000 行和 81 列的表格。我总共有 31 个索引。昨天我在一列上添加了一个新索引。现在,当我在 where 子句中单独使用该列时,结果非常快。但是,一旦我在不同索引列的 where 子句中添加另一个条件,查询就会变慢。例如,如果我有带有索引的列 c1、c2、c3、c4,则所有查询如下:
select c1,c2 from table1 where c1=a and c2=b and c3 = d
速度非常快。但是当我在现有列 c5 上添加新索引时,查询如下:
select c5 from table1 where c5>a
速度很快,但只要我添加新的条件,比如
select c5 from table1 where c5>a and c1=b
查询变慢。当我说慢时,它慢了 15-20 倍。快速查询需要 0.2 秒,慢速查询需要 3-4 秒。
非常需要帮助。谢谢
【问题讨论】:
-
您尝试过添加composite index 吗?
-
您可能想研究覆盖索引。
-
使用
EXPLAIN来分析查询。不要索引所有内容。索引不是您希望事情变得更快的神奇独角兽。始终指定您的数据集大小,无论您是否使用InnoDB,如果是,您的innodb_buffer_pool_size变量的值是多少。此外,具有 81 列和 31 个索引的东西只会尖叫“请删除我并规范化我以供将来使用”。 -
select c1,c2 from table1 where c1=a and c2=b and c3 = d-- 当您知道c1和c2是a和b时,您真的选择了它们吗?请不要挥手。创建索引比您想象的要微妙。 this` 查询的最佳索引是 _composite 索引:INDEX(c1,c2,c3)。在 this 情况下,列的顺序无关紧要。此外,给定这个复合索引,INDEX(c1)是多余的,但INDEX(c2)不是。