MySQL子查询比2个独立查询慢

我为一个简单的子查询而烦恼.我有以下查询女巫运行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通常可以解决问题.特定的问题是为每个比较运行子查询.创建临时表时,请规避它.

上一篇:如何基于一列的最大值从MySQL选择行并将另外两列分组?


下一篇:当子查询返回0行时,MySQL查询不返回任何内容