2013-12-11 57 views
0

這就是我現在擁有的。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's。該表擁有約12000項的和唯一的2700是唯一的客戶端ID的

+0

你有索引ClientID和ID? –

+1

@分形:'!='不會被B-樹索引 – zerkms

+1

嘿優化。只是我或你的條款和第一個條款幾乎相同嗎? SELECT ClientID其中PAmt爲空,但不是PAmt所在的ClientID。 –

回答

3

,我認爲這可以通過

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

容易解決編輯

在這背後的理由有些話:

MySQL中的子查詢是一件討厭的事情:如果結果集太大(原始SQL)或與驅動查詢(@DavidFleeman的答案)交織在一起,則內部查詢將循環,即重複ev駕駛查詢的排。這當然表現糟糕。

因此,我們嘗試以某種方式重新構造查詢,以避免循環。我的建議只運行兩個查詢:第一個(HAVING之前的所有內容)將創建一個臨時表,它將每個不同的ClientID標記爲至少有一個非空PAmt(或不),第二個僅選擇那些行臨時表,標記爲無,放入最終結果集中。

+0

OMG您從白夜拯救了我。謝謝!工作就像一個魅力:)現在我知道如何做得更好。 – user3092543

1

嘗試重新組織你的查詢是這樣的:

select clientID 
from Table 
group by clientID 
having max(length(PAmt)) == 0 
當然,你應該添加索引(clientID的,PAMT)

如果這個查詢仍然會工作緩慢,計算預加列

長度,並用該列替換的pAMT

+0

這一個執行更好,相同的速度0.016s,並給了我正確的結果。 2115和Eugen Rieck的解決方案我有2114年,可能我有一個NULL在那裏或什麼的。 – user3092543

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倍。