我为一个简单的子查询而烦恼.我有以下查询女巫运行30秒:
SELECT DISTINCT SUBSTRING( 6pp, 1, 4 ) AS postcode
FROM 6pp
WHERE gemeenteID
IN (
SELECT gebiedID
FROM tmp_orderimport
WHERE typeGebied = 'Gemeente'
AND idorder =1733
AND STATUS = TRUE );
说明:
如果我将查询分为2个查询并首先运行IN部分,则整个过程只花了不到一秒钟的时间.但当然我更喜欢使用一个查询.表格在MYISAM中.有什么建议么?
更新:
遵循戈登·利诺夫(Gordon Linoff)的例子.我将SQL更改为:
SELECT DISTINCT SUBSTRING( 6pp, 1, 4 ) AS postcode
FROM `6pp`
WHERE EXISTS (SELECT 1
FROM tmp_orderimport oi
WHERE oi.gebiedID = `6pp`.gemeenteID AND
typeGebied = 'Gemeente' AND idorder = 1733 AND STATUS = TRUE
);
并在tmp_orderimport(gebiedID,typeGebied,idorder,状态)上添加了索引.现在查询将在4秒内运行.
新说明:
解决方法:
尝试使用存在代替:
SELECT DISTINCT SUBSTRING( 6pp, 1, 4 ) AS postcode
FROM `6pp`
WHERE EXISTS (SELECT 1
FROM tmp_orderimport oi
WHERE oi.gebiedID = `6pp`.gemeenteID AND
typeGebied = 'Gemeente' AND idorder = 1733 AND STATUS = TRUE
);
您也可以使用tmp_orderimport(gebiedID,typeGebied,idorder,status)上的索引来加快速度.
将IN与子查询一起使用时,MySQL可能效率低下(有时并取决于版本). EXISTS通常可以解决问题.特定的问题是为每个比较运行子查询.创建临时表时,请规避它.