SELECT COUNT(*) AS cnt
FROM products
WHERE ExternalProductId IS NOT NULL
GROUP BY SourceId, ExternalProductId
HAVING cnt > 1
在(ExternalProductId,SourceId,AnotherField)上有一個索引。解釋顯示使用了索引。這是在「額外」列印解釋:爲什麼下面的查詢複製表數據?
Using where; Using index; Using temporary; Using filesort
當我運行通過SHOW PROCESSLIST查詢我看到:
Copying to tmp table on disk
我可以調整這個查詢在地方工作的指標?我也不介意由於其他進程同時在這個表上工作,我得到的結果稍微不準確 - 我可以更改隔離級別來提高查詢的性能嗎?
我想你有一些誤解。臨時表並不意味着從表中複製所有數據以完成其工作。它只意味着它將一些中間結果複製到臨時表中以供進一步處理。臨時表可能包含ExternalProductID不爲空和cnt列的所有記錄,因此它可以評估'HAVING'子句。其次,事務隔離與臨時表無關。 – bot403 2010-12-16 15:37:15
@ bot403 - 我剛剛和我們的DBA交談過,他同意你的意見。我相信你的評論實際上是迄今爲止這個問題的最佳答案。 – ripper234 2010-12-16 17:40:05
是的,我認爲答案是我的#1和阿杰里爾的指數建議。 – bot403 2010-12-16 19:04:11