选择WHERE IN和子查询非常慢

时间:2014-10-01 16:48:25

标签: mysql

我想要解释以下查询:

SELECT *
FROM `bm_tracking`
WHERE `oid` IN
    (SELECT `oid`
    FROM `bm_tracking`
    GROUP BY `oid` HAVING COUNT(*) >1)

子查询:

SELECT  `oid` 
FROM  `bm_tracking` 
GROUP BY  `oid` 
HAVING COUNT( * ) >1

执行0.0525秒

整个查询"卡住" (3分钟后仍在处理......)。列oid已编入索引。

bm_tracking包含大约64,000行。

这可能是什么原因导致"卡住"?

[编辑:根据要求]

CREATE TABLE `bm_tracking` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `oid` varchar(10) NOT NULL,
 `trk_main` varchar(50) NOT NULL,
 `tracking` varchar(50) NOT NULL,
 `label` text NOT NULL,
 `void` int(11) NOT NULL DEFAULT '0',
 `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`),
 KEY `oid` (`oid`),
 KEY `trk_main` (`trk_main`),
 KEY `tracking` (`tracking`),
 KEY `created` (`created`)
) ENGINE=MyISAM AUTO_INCREMENT=63331 DEFAULT CHARSET=latin1

[执行计划] enter image description here

1 个答案:

答案 0 :(得分:2)

通常比EXISTSIN,所以你可以尝试一下,看看它是否更适合你

SELECT *
FROM `bm_tracking` bt
WHERE EXISTS
(   SELECT 1
    FROM `bm_tracking` bt1
    WHERE bt.oid = bt1.oid
    GROUP BY `oid` 
    HAVING COUNT(*) >1
)

编辑:

如果您从EXPLAIN中注意到您发布了... IN()被视为相关子查询,这是一个相关子查询...这意味着对于表中的每一行,都会拉取并比较表中的所有行。 ..所以例如表中的1000行意味着1000 * 1000 = 100万比较 - 这就是为什么它花了这么长时间