MySQL "IN"使用子查询查询非常慢,但使用显式值查询速度很快

标签 mysql query-optimization

我有一个 MySQL 查询(Ubu 10.04、Innodb、Core i7、16Gb RAM、SSD 驱动器、MySQL 参数优化):

SELECT
COUNT(DISTINCT subscriberid)
FROM
em_link_data
WHERE
linkid in (SELECT l.id FROM em_link l WHERE l.campaignid = '2900' AND l.link != 'open')

表 em_link_data 大约有 700 万行,em_link 有几千行。 完成此查询大约需要 18 秒。但是,如果我替换结果 子查询并执行以下操作:

SELECT
COUNT(DISTINCT subscriberid)
FROM
em_link_data
WHERE
linkid in (24899,24900,24901,24902);

那么查询将在不到 1 毫秒的时间内运行。子查询单独运行不到1ms,列linkid被索引。

如果我将查询重写为连接,也少于 1 毫秒。为什么带有子查询的“IN”查询这么慢,为什么带有值的查询这么快?我无法重写查询(购买的软件),所以我希望有一些调整或提示来加速这个查询!任何帮助表示赞赏。

最佳答案

每次评估子查询时都会执行它们(无论如何在 MySQL 中,不是所有 RDBMS),即您基本上运行了 700 万个查询!如果可能,使用 JOIN 会将其减少到 1。即使添加索引提高了它们的性能,您仍在运行它们。

关于MySQL "IN"使用子查询查询非常慢,但使用显式值查询速度很快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5018284/

相关文章:

php - 优先在 php 中打印数组值

mysql - 为什么 MySQL 中 where vs join 子句的性能差异

PostgreSQL 11 在索引应该足够的分区表上进行并行 seq 扫描

postgresql - URL 文本字段的查询优化

mysql - 使用 SQLyog 将数据从 Excel 导入到 MySQL 数据库

php - 如何从准备好的语句中获取行数据,然后将其与 AJAX() 函数一起使用

MySQL优化/性能,如何高效使用limit |基于位置的选择

MySQL不使用纯粹基于数据量的索引

php - 计算gps坐标半径

MySQL 结果集问题