Mysql 选择中的位置和子查询速度非常慢

Mysql 选择中的位置和子查询速度非常慢,mysql,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分钟后,整个查询仍在处理中。。。

我要执行以下查询:

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包含大约64k行

这可能是什么原因造成的

[编辑:根据要求]

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
[执行计划]

通常存在的速度比中快,因此您可以尝试一下,看看它是否对您的执行效果更好

SELECT *
FROM `bm_tracking` bt
WHERE EXISTS
(   SELECT 1
    FROM `bm_tracking` bt1
    WHERE bt.oid = bt1.oid
    GROUP BY `oid` 
    HAVING COUNT(*) >1
)
编辑:
如果你从你发布的解释中注意到。。。IN被视为相关子查询的从属子查询。。。这意味着对于表中的每一行,表中的所有行都会被拉入并比较。。。例如,表中的1000行意味着1000*1000=100万次比较-这就是为什么它需要这么长时间的原因

也许我错了,但是我看不出有子查询的原因…我想显示oid重复的所有行。因此子查询应该给我所有重复的oid,并且“main query”应该输出所有带有这些oid的行。它是从php执行的,因此我可以轻松地将其拆分为2个请求,但是“一体式”可能会更好,因为你在oid上的基数非常倾斜,但这仍然不能解释速度慢的原因。我认为你在子查询中遇到了一个著名的mysql错误。太糟糕了,mysql不支持with语句。谢谢约翰,这很有魅力。。但我仍然想知道为什么查询会出现问题…@AndreasHinderberger阅读。。。exists可以比IN更好地优化执行计划:@AndreasHinderberger我刚刚编辑了我的问题,解释了为什么会这样longer@JohnRuddell:我无法编辑你的答案,有一个打字错误。前面的`存在。谢谢:D