假设我有这个查询:
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行
- 该表有超过 100 万行
- EXPLAIN 显示使用了复合索引(budget,user):EXPLAIN EXTENDED 显示有1477594行,过滤了大约50%
最佳答案
EXPLAIN
并不是真的知道,所以它说的正好是 50%。不要相信那个。
您使用了 LIMIT
,表格的前面有那么多行满足单一条件。
但它必须扫描整个表才能找到组合过滤器的 3 行。
没有索引对两个范围(预算 > 100 和用户 > 1000
)有用,但其中任何一个都会有所帮助:
INDEX(budget, ...)
INDEX(users, ...)
...
可以是任何东西,也可以什么都不是。可以使用一个索引,但仅限于第一列。
有可能同时使用这两个索引。这是使用“索引合并”工具。如果使用它,那么该过程将是从 budget
索引中提取 100K id,从 user
索引中提取 100K 行,然后找到两者中的 3 个 id,最后为它们查找行 (*
)。优化器根据“50%”或“100K”或月相决定不值得。
由于表的 10% 满足单一条件,优化器可能决定扫描表比在索引和数据之间来回跳动更快。请提供SHOW CREATE TABLE
和EXPLAIN SELECT
。
关于mysql - 为什么这个 MySQL 查询在条件组合时慢,但在条件分离时快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42094051/