MySQL选择不在真的很慢

时间:2013-12-11 21:27:42

标签: mysql

这就是我现在所拥有的。

SELECT distinct ClientID 
    FROM Table
    WHERE PAmt = '' and ClientID not in 
        (select distinct ClientID from Table where PAmt != '') 
    ORDER BY ID ASC

ClientID可以在表内多次,其中一些有PAmt值,有些则没有。 我试图只获得从未有过PAmt值的clientid。该表有大约12000个条目,只有2700个是独特的clientid's

4 个答案:

答案 0 :(得分:3)

我认为这可以通过

更容易解决
SELECT 
  ClientID,
  MAX(IF(PAmt='',0,1)) AS HasPAmt
FROM `Table`
GROUP BY ClientID
HAVING HasPAmt=0

修改

关于这背后的理由的一些说法:

MySQL中的子查询是一个令人讨厌的事情:如果结果集太大(原始SQL)或与驱动查询交织(@DavidFleeman的答案),则内部查询循环,即对于每行驱动重复查询。这个过程表现不佳。

因此我们尝试以某种方式重新构造查询,以避免循环。我的建议只运行两个查询:第一个(HAVING之前的所有内容)将创建一个临时表,将每个不同的ClientID标记为至少有一个非空PAmt(或不是),第二个仅选择临时表中那些被标记为无的行进入最终结果集。

答案 1 :(得分:1)

尝试将您的查询重新组织为以下内容:

select clientID
from Table
group by clientID
having max(length(PAmt)) == 0

当然你应该添加索引(clientID,PAmt)

如果此查询仍然运行缓慢,请添加具有预先计算长度的列,并将PAmt替换为此列

答案 2 :(得分:0)

尝试使用not exists而不是in。

http://sqlfiddle.com/#!2/249cd5/26

答案 3 :(得分:0)

拿走子查询:

$clientIds = runQuery("select distinct ClientID from Table where PAmt != ''");
$clientIds = implode(",", $clientIds);

runQuery("SELECT distinct ClientID 
FROM Table
WHERE PAmt = '' and ClientID not in 
    ({$clientIds}) 
ORDER BY ID ASC")

我知道MySQL应该为你做优化步骤,但事实并非如此。如果您将子查询作为单独的查询执行,您会发现查询的速度提高了大约12000倍。