Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何有效地识别大表中最常用的字符串?_Mysql_Optimization_Performance_Query Optimization - Fatal编程技术网

Mysql 如何有效地识别大表中最常用的字符串?

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` (`

假设一张有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位的人花了一整天的时间。有什么建议吗?

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

使用触发器(如果
last\u name\u表中每分钟没有数千次插入,或者如果实时统计有意义)或调度程序每天维护一次(小时等)。SQL92为此定义了一个“TOP”操作符,因此在符合SQL92的数据库中,您应该能够写入

选择前10000名。。。来自last_name_表;

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

如果您添加一个子句“HAVING count(last_name)>10”或类似的内容,那么它将从您的结果中删除所有不常见的项。这样做,您就不需要“限制”或“订购方式”。这可能会加快速度。此外,如果使用last_name字段为cnt编制索引,则该索引可能会提高性能

如何有效地识别大表中最常用的字符串

根据你的问题,我假设你不需要确切的数字,大概的数字就足够了


我提供给您选择随机行的子集,并对其进行所有需要的计算。然后对结果进行相对缩放,以获得反映整个表的近似结果。您有足够多的数据,即使使用近似值也能得到准确的结果。

我目前正忙于“复制到磁盘上的tmp表”。问题是如何提高查询效率。自豪地-看不到任何可以提高查询性能的建议。