在我的MySQL数据库中,表事件具有一个组合索引,其中包含列closingeventid,timeStart和eventCode。表事件中有超过2100万行。IN和INNER JOIN在我的情况下有什么区别?
这是两个SQL,如果我在MySQL命令行中运行第一个SQL,进程mysqld-nt.exe的Mem Usage以每秒10 M的速度逐渐增加,它会上升到1.6 G左右,然后直线下降到30 M左右然后命令行返回Out of Memory异常。
但是,如果我使用第二个SQL,使用INNER JOIN而不是IN,那就没关系。看来IN子句不会触及任何索引。
为什么?任何想法来监视MySQL执行过程像MS SQL的执行计划?
SELECT COUNT(*) AS 'cnt'
FROM events
WHERE
(timeStart < '2010-09-22 14:29:10’)
AND (closingeventid IS NULL)
AND (eventcode IN (SELECT DISTINCT evtcclosed FROM eventclose))`
VS
SELECT COUNT(1) AS 'cnt'
FROM events
inner join
(SELECT DISTINCT evtcclosed FROM eventclose) ec
ON ec.evtcclosed = events.eventcode
WHERE (timeStart < '2010-09-22 14:29:10’) AND (closingeventid IS NULL)
我相信你正在考虑相关子查询,它执行外部查询的每一行查询。相关的子查询将包含来自子查询内部的外部查询的列比较。例如:SELECT t1。* FROM t1 WHERE t1.id IN(SELECT t2.id FROM t2 WHERE t2.name = t1.name); – 2010-10-29 03:36:22