Mysql 聚合行并创建主键

Mysql 聚合行并创建主键,mysql,myisam,Mysql,Myisam,我需要修复一个缺少主键的问题,我想得到一些想法 这是最好的方法 我们在几个生产数据库上都有一个程序,我们每天都在其中插入新数据 一个小时进入一个汇总表。其中五列为键,其他列为键 不同和的值。我们使用ON DUPLICATE KEY UPDATE来添加到 每次插入时的总和。insert语句如下所示: INSERT INTO sums (key1,key2,key3,key4,key5,sum1,sum2) VALUES (..., 13, 42, 3) ON DUPLICATE KEY UPDAT

我需要修复一个缺少主键的问题,我想得到一些想法 这是最好的方法

我们在几个生产数据库上都有一个程序,我们每天都在其中插入新数据 一个小时进入一个汇总表。其中五列为键,其他列为键 不同和的值。我们使用ON DUPLICATE KEY UPDATE来添加到 每次插入时的总和。insert语句如下所示:

INSERT INTO sums (key1,key2,key3,key4,key5,sum1,sum2) VALUES (..., 13, 42, 3)
ON DUPLICATE KEY UPDATE sum1=VALUES(sum1)+sum1,sum2=VALUES(sum2)+sum2
问题是创建表时,主键没有设置(不是我的错:)。 现在我需要聚合具有相同键的行,然后添加 主键。由于缺少主键,表已扩展到大约 在一些系统上有700000行,所以我需要一些有效的方法来实现这一点

我想这样做,而不必推迟增加新的行每年 小时。因为系统现在的工作方式是保存插入和执行 以后需要做很多工作

我做的每一次手术都不能把桌子锁上45分钟左右。 我希望创建实际主键所需的时间比我管理的时间要短 先合并一些行。也许为一些人创建索引会更快一些 首先是键列,这样我就有了一个用于聚合行操作的索引

我也不确定聚合行的最佳方法是什么。好吗
建议将不胜感激。

我想尝试一下这样的方法来克服它们

select key1,key2,key3,k4,key5,
convert(key1 as varchar) + convert(key2 as varchar) + convert(key3 as varchar) + convert(k4 as varchar) + convert(key5 as varchar) as Pk
from sums
group by key1,key2,key3,k4,key5
having distinct(convert(key1 as varchar) + convert(key2 as varchar) + convert(key3 as varchar) + convert(k4 as varchar) + convert(key5 as varchar))
我不羡慕你,700米是有限的,像你想做的那样的手术应该需要一定的时间

希望这有帮助


干杯

首先,将现有的SUMMS表重命名为SUMMS\u old并创建新的、正确的SUMMS表,这样您就可以继续按小时计算。但是,要意识到,在应用聚合数据之前,SUMMES表中的数据是不正确的

现在,应用以下查询来更新表:

INSERT INTO sums (key1, key2, key3, key4, key5, sum1, sum2)
SELECT key1, key2, key3, key4, key5, sum1, sum2 FROM sums_old
ON DUPLICATE KEY UPDATE sum1 = VALUES(sum1) + sum1, sum2 = VALUES(sum2) + sum2
但是,请稍候,因为您使用的是MyISAM,并且不希望表被锁定太长,所以请分块执行,并限制:

INSERT INTO sums (key1, key2, key3, key4, key5, sum1, sum2)
SELECT key1, key2, key3, key4, key5, sum1, sum2 FROM sums_old
ORDER BY some_index
LIMIT 0, 250000
ON DUPLICATE KEY UPDATE sum1 = VALUES(sum1) + sum1, sum2 = VALUES(sum2) + sum2

INSERT INTO sums (key1, key2, key3, key4, key5, sum1, sum2)
SELECT key1, key2, key3, key4, key5, sum1, sum2 FROM sums_old
ORDER BY some_index
LIMIT 250000, 250000
ON DUPLICATE KEY UPDATE sum1 = VALUES(sum1) + sum1, sum2 = VALUES(sum2) + sum2

INSERT INTO sums (key1, key2, key3, key4, key5, sum1, sum2)
SELECT key1, key2, key3, key4, key5, sum1, sum2 FROM sums_old
ORDER BY some_index
LIMIT 500000, 250000
ON DUPLICATE KEY UPDATE sum1 = VALUES(sum1) + sum1, sum2 = VALUES(sum2) + sum2

...
您需要按某个键进行排序,以便分块执行,因此如果没有,则需要将其添加到旧表中


找出一个好的块大小。

键1到键5是否按时间顺序排列?以便您可以识别在某个时间点之后添加的行?在这种情况下,我会分块运行聚合查询——首先是第一个一百万行,然后是第二个,依此类推——并将聚合结果复制到一个新表中。这可能足够快,这样您就不会锁定表太长时间,并且可以在不到45分钟的最后一次运行后切换到新表。是的,其中一个关键列是基于日期的。我想对于实际的合并,我需要分块进行。也许最好的开始方法是为基于日期的列添加一个索引,然后看看需要多长时间。我想用几个值建立一个索引比一次为所有键建立一个索引要快。创建一个新表并让每小时进程插入其中是一个非常好的主意。我只需要说服一些客户,暂时获取不正确的数据比不获取数据要好(现在发生的事情是,因为每个查询都是一次完整的表扫描)。