一尘不染

MySQL“ IN”查询使用子查询的速度非常慢,但是使用显式值的速度非常快

mysql

我有一个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毫秒的时间内运行。仅子查询在不到1毫秒的时间内运行,因此索引了列linkid。

如果我将查询重写为联接,则还不到1ms。为什么“
IN”查询中的子查询这么慢,为什么其中包含值的这么快?我无法重写查询(购买的软件),因此希望进行一些调整或提示以加快查询速度!任何帮助表示赞赏。


阅读 434

收藏
2020-05-17

共1个答案

一尘不染

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

2020-05-17