假设我有这个问题:
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上是否有聪明人知道为什么会这样,以及在这种情况下如何优化?
额外说明:
答案 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 TABLE
和EXPLAIN SELECT
。