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

标签 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行
  • 该表有超过 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/

相关文章:

postgresql - 如何在 PostgreSQL 上添加条件唯一索引

MySQLdump 与 WINDOWS10 : OS errno 13 - (Permission denied) when executing 'SELECT INTO OUTFILE'

mysql - 如果列 = 1,则添加到 CONCAT()

mysql - 在 MySQL 中随机选择 3 个最低值之一 : using ORDER BY RAND()

performance - 加速numpy矩阵逆

mysql - 在MySQL中,如何查询 "last inserted row equals"?

mysql - 从 Java 和 Shell 运行 cmd 时在 Mysqldump 中添加日期

c++ - 如何通过 IO 时序测量找到 L1 缓存线大小的大小?

c# - 预加载 WPF 窗口(可能在其他线程中)以提高性能

performance - MongoDB 中的复合索引是否改进了多重匹配(而不是排序)?