我有一个 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/