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

时间:2011-07-07 23:54:57

标签: mysql optimization performance query-optimization

假设有一个包含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名是整天(字面意思)。有什么建议吗?

4 个答案:

答案 0 :(得分:2)

建议:预先计算每个last_name的计数并将其存储在单独的表中。

使用触发器维护它(如果last_name_table中没有数千个插入,或者实时统计有意义)或者每天一次(小时等)调度程序。

答案 1 :(得分:2)

  

如何有效识别大表中最流行的字符串?

根据你的问题,我假设你不需要确切的数字,而且近似数字就足够了。

我建议您选择随机行的子集并对其进行所有必要的计算。然后对结果进行相对缩放,以获得反映整个表格的近似结果。即使有近似值,您也有足够的数据来获得准确的结果。

答案 2 :(得分:0)

SQL92为此定义了一个“TOP”运算符,因此在符合SQL92的数据库中,您应该能够写入 SELECT TOP 10000 ... FROM last_name_table;

但是,MySQL没有实现这一点,你必须根据自己的建议使用LIMIT。

答案 3 :(得分:0)

如果您添加一个条款“HAVING count(last_name)> 10”或类似的内容,那么它将从结果中删除所有不常见的项目。这样做,你不需要“LIMIT”或“order by”。它可能会加快速度。此外,如果使用last_name字段索引cnt,则索引可能会提高性能。