gpt4 book ai didi

mysql - 为什么这个 MySQL 查询在条件组合时慢,但在条件分离时快?

转载 作者:行者123 更新时间:2023-11-30 22:05:02 25 4
gpt4 key购买 nike

假设我有这个查询:

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 TABLEEXPLAIN SELECT

关于mysql - 为什么这个 MySQL 查询在条件组合时慢,但在条件分离时快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42094051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com