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