簡體   English   中英

如何優化 mysql Distinct?

[英]How to optimize mysql Distinct?

Tbl_responses

  • ID
  • 回復
  • msgstr
  • 用戶名

有 5,000 條記錄。 “zac1987”發布了 800 條回復。 “zac1987”發布的 800 條回復中有 30 條不同的msgid

SELECT DISTINCT msgid 
  FROM Tbl_responses 
 WHERE username = 'zac1987';

目前,解釋 SQL 顯示影響了 800 行。 如何優化查詢以便只影響 30 行? 我認為必須有一個解決方案來避免循環/過濾 800 條記錄......就像用我的博客上顯示的 JOIN 子句問題替換 WHERE 子句一樣...... ye5.blogspot.com/2011/07/optimize-faster- mysql-query-speed.html我正在尋找一些專家來提出一個解決方案,以避免循環 800 條記錄。

我的另一個問題 - 為什么這個頁面http://forge.mysql.com/wiki/Top10SQLPerformanceTips說“當你有或可以使用 GROUP BY 時不要使用 DISTINCT”,因為它會減慢查詢速度? 但是我測試過,結果並沒有變慢,為什么?

如您所說,嘗試重寫查詢以使用GROUP BY子句:

SELECT msgid 
  FROM Tbl_responses 
 WHERE username = 'zac1987' GROUP BY msgid;

並查看性能差異

檢查覆蓋索引是否會在您的情況下表現更好。 http://ronaldbradford.com/blog/tag/covering-index/

這兩個查詢是等價的:

SELECT DISTINCT msgid 
FROM Tbl_responses 
WHERE username = 'zac1987' ;

SELECT msgid 
FROM Tbl_responses 
WHERE username = 'zac1987'
GROUP BY msgid ;

我建議您在(username, msgid)上創建一個復合索引。 這將有助於查詢的任一版本。

但最好是制作一個包含 10K(甚至 100k 或 1M)行的測試表並嘗試速度和執行計划,首先在(username)上使用簡單索引,然后在(username, msgid)上使用復合索引.

差異將顯示在執行計划的Extra列中,對於第一種使用簡單索引的情況,它將顯示"Using where, using temporary" ,在第二種情況下,使用復合索引將顯示"Using where , 使用索引"

正如 Tudor 所指出的,擔心 5000 條記錄的速度是過早的優化。 當您有 50 萬條記錄或看到性能下降時,您應該開始擔心。


注意:這兩個查詢等價,因此您不能總是通過將字段移動到 GROUP BY 來刪除 DINSTINT 子句並期望得到相同的結果:

SELECT DISTINCT msgid, response
FROM Tbl_responses 
WHERE username = 'zac1987' ;

SELECT msgid, response
FROM Tbl_responses 
WHERE username = 'zac1987'
GROUP BY msgid ;

放置一些條件,例如 WHERE username='zac1987' AND id='XYZ' 因為無法僅根據您的要求使用 distinct 和 group by 過濾行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM