2011-07-07 63 views
2

假設一張5000萬個姓氏的表格(例如),如何有效地識別前10000個?如何有效識別大表中最流行的字符串?

難道還有比這更有效的查詢?

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的人正在整天(字面上)。有什麼建議麼?

+0

我目前停留在「複製到tmp目錄的磁盤表」。 – Ryan

回答

2

我怎樣纔能有效地識別在一張大桌子最流行的琴絃?

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

我給你選擇隨機行中的一個子集,做這一切所需的計算。然後對結果進行相對縮放以獲得反映整個表格的近似結果。即使有近似值,您也有足夠多的數據來獲得準確的結果。

+0

+1;這是一個好主意。統計數據總是隱藏在我身上。 –

2

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

用觸發器維護它(如果在last_name_table中沒有成千上萬的插入,或者實時統計是有意義的話),或者調度器每天一次(小時等)。

0

SQL92對這個定義的「TOP」操作,所以在SQL92兼容的數據庫,你應該能夠編寫
SELECT TOP 10000 ... FROM last_name_table;

但是MySQL的還沒有實現這一點,你必須使用LIMIT按你自己建議。

+0

問題是關於如何使查詢有效。驕傲地 - 看不到任何可以提高查詢性能的建議。 – zerkms

0

如果添加一個條款,「具有計數(姓氏)> 10」或類似的東西,那麼它會從你的結果去掉所有的罕見物品。這樣做,你不需要「限制」或「按順序」。它可能會加快速度。此外,如果您使用last_name字段將cnt編入索引,則索引可能會提高性能。

相關問題