我正为一个简单的子查询而绞尽脑汁。下面是运行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 ); 解释:

如果我在两个查询中中断查询,并首先运行in部分,则整个过程只需一秒钟。当然,我更喜欢使用一个查询。表格载于MYISAM。有什么建议吗?
更新:
以戈登·林诺夫为例。我将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、status)。现在,查询运行不到4秒。
新解释:

发布于 2014-12-23 13:26:36
试着使用exists来代替:
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)上建立索引来加快速度。
当使用带有子查询的MySQL时,IN可能会效率低下(有时取决于版本)。EXISTS通常解决这个问题。具体的问题是每个比较都运行子查询。创建临时表时,可以避免这种情况。
发布于 2014-12-23 13:26:34
使用内连接代替运算符中的
试试这个:
SELECT DISTINCT SUBSTRING(a.6pp, 1, 4) AS postcode
FROM 6pp a
INNER JOIN tmp_orderimport b ON a.gemeenteID = b.gebiedID
WHERE b.typeGebied = 'Gemeente' AND b.idorder =1733 AND b.STATUS = TRUE 发布于 2014-12-23 13:30:09
可能MySQL正在对主查询的每个记录运行一次子查询。这最终导致了指数处理。
他的子查询独立于主查询,您可以先运行子查询并将值存储在内存中(可能是临时表),然后使用主查询。
https://stackoverflow.com/questions/27621289
复制相似问题