簡體   English   中英

如何有效地識別大表中最流行的字符串?

[英]How can I efficiently identify the most popular strings in a large table?

假設一張包含 5000 萬個姓氏的表格(例如),如何有效地識別前 10,000 個姓氏?

還有比這更有效的查詢嗎?

SELECT count(last_name) as cnt, last_name
FROM last_name_table
GROUP BY last_name
ORDER BY cnt DESC
LIMIT 10000;

假設:

CREATE TABLE last_name_table (
    `last_name` VARCHAR(255), 
     KEY `last_name` (`last_name`)
);

我可以在20分鍾內獲得前1000名。 但是前 10000 名需要一整天(字面意思)。 有什么建議么?

建議:預先計算每個last_name的計數,並將其存儲在單獨的表中。

使用觸發器(如果在last_name_table中每分鍾沒有數千個插入,或者如果實時統計有意義)或每天一次(小時等)調度程序來維護它。

如何有效地識別大表中最流行的字符串?

根據您的問題,我假設您不需要確切的數字,而近似數字就足夠了。

我為您提供 select 隨機行的子集,並對其進行所有需要的計算。 然后對結果進行相對縮放以獲得反映整個表格的近似結果。 即使使用近似值,您也有足夠多的數據來獲得准確的結果。

SQL92 為此定義了一個“TOP”運算符,因此在符合 SQL92 的數據庫中,您應該能夠編寫
SELECT TOP 10000... FROM last_name_table;

但是 MySQL 沒有實現這個,你必須根據你自己的建議使用 LIMIT 。

如果您添加一個子句“HAVING count(last_name) > 10”或類似的東西,那么它將從您的結果中刪除所有不常見的項目。 這樣做,您將不需要“限制”或“訂購依據”。 它可能會加快速度。 此外,如果您使用 last_name 字段對 cnt 進行索引,則該索引可能會提高性能。

暫無
暫無

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

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