在我的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