为什么这个MySQL查询在组合条件时会变慢,但是当它们分开时会很快?

时间:2017-02-07 15:44:53

标签: mysql performance indexing query-optimization

假设我有这个问题:

select * from tablea where budget > 100 and users > 1000 

单独查询:

select * from tablea where budget > 100

select * from tablea where users > 1000

在0.01秒内完成

但是,当组合条件时,查询需要1-2秒才能完成。

我在两个列上都有索引(预算,用户)。

SOF上是否有聪明人知道为什么会这样,以及在这种情况下如何优化

额外说明:

  • 运行第一个查询时,有100000行,100000行 第二个查询,以及组合查询时的3行
  • 该表有超过1行的行
  • EXPLAIN显示使用了复合索引(预算,用户):EXPLAIN EXTENDED显示有1477594行,约50%已过滤

1 个答案:

答案 0 :(得分:0)

EXPLAIN并不是真的知道,所以它恰好说了50%。不要相信。

您使用了LIMIT,表格的前面是那些符合单一条件的行。

但它必须扫描整个表格才能找到合并过滤器的3行。

没有索引对两个范围(budget > 100 and users > 1000)有用,但其中任何一个都有帮助:

INDEX(budget, ...)
INDEX(users, ...)

...可能是任何事情或什么也不是。可以使用一个索引 ,但仅限于第一列。

这两个指标都有可能被使用。这是"索引合并"设施。如果使用它,则该过程将从budget索引中提取100K ID,从user索引中提取100K行,然后找到两者中的3个ID,最后查找行(*)为他们。优化器决定不值得,基于" 50%"或" 100K"或月亮的阶段。

由于10%的表符合单一条件,因此优化程序可能决定扫描表格更快,而不是在索引和数据之间来回跳转。请提供SHOW CREATE TABLEEXPLAIN SELECT