我想要解释以下查询:
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
[执行计划]
答案 0 :(得分:2)
通常比EXISTS
快IN
,所以你可以尝试一下,看看它是否更适合你
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万比较 - 这就是为什么它花了这么长时间