簡體   English   中英

mysql在600萬行上的區別需要17分鍾才能運行? 我可以加快速度嗎?

[英]mysql distinct on 6 million rows takes 17 minutes to run? Can I speed this up?

我正在嘗試從600萬行表中獲取不同的ID。 查詢非常簡單,並且解釋似乎還可以。 Distict行被索引為uid-date-time分組索引的一部分。

查詢是

SELECT DISTINCT uid FROM events;

並在17分鍾15.54秒內返回334117行。

的解釋是

+----+-------------+-------------+-------+---------------+----------------+----
----+------+------+--------------------------+
| id | select_type | table       | type  | possible_keys | key            | keylen | ref  | rows | Extra                    |
+----+-------------+-------------+-------+---------------+----------------+--------+------+------+--------------------------+
|  1 | SIMPLE      | events     | range | NULL          | dateuid_idx      | 4     | NULL |   10 | Using index for group-by |
+----+-------------+-------------+-------+---------------+----------------+----
----+------+------+--------------------------+

如果將uid放在單獨的索引中,這樣做會更快嗎? 還是有另一種方法可以加快速度?

看來您按日期索引,然后按UID索引,這無濟於事。 首先通過UID進行索引或為UID單獨索引將大大提高性能。

另外,您可以考慮使用GROUP BY而不是DISTINCT

是的,將uid作為單獨的索引可以更快。 如果沒有索引,則需要全表掃描; 也就是說,它實際上遍歷每一行,並檢查是否已經選擇了特定的uid。

但是,以uid作為索引,它只需要遍歷索引樹,如果有很多重復的uid,這可能會快得多。

在uid上創建索引

單獨的uid索引將加快處理速度。 但是創建索引可能需要大約17分鍾的時間 (因為創建索引必須進行大致相同的“讀取”量)。

因此,創建這樣的索引都取決於預期的用法。 如果多次運行相關查詢(如果僅在當前的重復記錄搜尋“活動”期間),則可能是一項不錯的“投資”。

暫無
暫無

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

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