[英]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.