获取大型 MySql 表中值频率分布的有效方法

Posted

技术标签:

【中文标题】获取大型 MySql 表中值频率分布的有效方法【英文标题】:Efficient way to get frequency distribution of values in a large MySql table 【发布时间】:2012-07-20 15:15:12 【问题描述】:

我有两张桌子,即。 Total_DataDistinct_S1

Total_Data 有 350 万行。字段:“S1”、“S2”、“S3”、“S4”

Distinct_S1 有 100 万行。字段:“S1”、“频率”。 Distinct_S1 的“S1”由 Total_Data 的“S1”中出现的所有不同值组成。

手头的任务: S1 = 'xxyy' 的 Distinct_S1 的“频率”(假设)应包含 Total_Data 中出现 'xxyy' 的次数。

我在 python 脚本(导入 mysqldb)中使用了以下查询来完成手头的任务:

cur.execute("update Distinct_S1 set frequency=(select count(*) from Total_Data where S1='%s') where S1='%s'"%(S1_val, S1_val)

上述查询工作正常,但似乎需要很多时间。有没有其他更快的方法来达到同样的效果?

【问题讨论】:

【参考方案1】:

您可以使用带有连接的多表更新语法一次更新所有行。语法见manual。

但更简单的方法是直接在表中插入所有值,而无需先用不同的值填充它。

INSERT INTO Distinct_S1 (S1, frequency)
SELECT S1, COUNT(*)
FROM Total_Data
GROUP BY S1

【讨论】:

我运行了您的上述查询。 13分钟后,大功告成!非常感谢!附:我猜更新比插入更昂贵,“python-to-mysql-to-python 转换”可能需要很多时间。

以上是关于获取大型 MySql 表中值频率分布的有效方法的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 中,对于连接谓词之间具有多对多关系的大型表,最有效的查询设计是啥?

在大型mysql表中找到每个不同的其他值出现次数最多的值的有效方法[关闭]

为大型数据集生成 ngram 频率

将大型 mysql 数据库移动到不同的服务器

在现有的大型表上创建列存储索引的最有效方法?

大型分布式数据库中间件MyCat的安装与使用