Mysql 如何有效地识别大表中最常用的字符串?
假设一张有5000万名姓氏的表格(例如),如何有效识别前10000名 还有比这更有效的查询吗Mysql 如何有效地识别大表中最常用的字符串?,mysql,optimization,performance,query-optimization,Mysql,Optimization,Performance,Query Optimization,假设一张有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` (`
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\u name\u表中每分钟没有数千次插入,或者如果实时统计有意义)或调度程序每天维护一次(小时等)。SQL92为此定义了一个“TOP”操作符,因此在符合SQL92的数据库中,您应该能够写入
选择前10000名。。。来自last_name_表;
但是MySQL没有实现这一点,您必须根据自己的建议使用LIMIT。如果您添加一个子句“HAVING count(last_name)>10”或类似的内容,那么它将从您的结果中删除所有不常见的项。这样做,您就不需要“限制”或“订购方式”。这可能会加快速度。此外,如果使用last_name字段为cnt编制索引,则该索引可能会提高性能
如何有效地识别大表中最常用的字符串
根据你的问题,我假设你不需要确切的数字,大概的数字就足够了
我提供给您选择随机行的子集,并对其进行所有需要的计算。然后对结果进行相对缩放,以获得反映整个表的近似结果。您有足够多的数据,即使使用近似值也能得到准确的结果。我目前正忙于“复制到磁盘上的tmp表”。问题是如何提高查询效率。自豪地-看不到任何可以提高查询性能的建议。