获取大型 MySql 表中值频率分布的有效方法
Posted
技术标签:
【中文标题】获取大型 MySql 表中值频率分布的有效方法【英文标题】:Efficient way to get frequency distribution of values in a large MySql table 【发布时间】:2012-07-20 15:15:12 【问题描述】:我有两张桌子,即。 Total_Data 和 Distinct_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 中,对于连接谓词之间具有多对多关系的大型表,最有效的查询设计是啥?