标记大型mysql文件的记录

时间:2014-01-08 20:28:37

标签: mysql performance csv

我们目前正在将非常大的CSV文件导入mySQL数据仓库。处理的关键部分是标记CSV文件中的记录是否与仓库中的现有记录匹配。 “匹配”是通过将新数据中的特定字段与表的先前版本进行比较来完成的。如果记录是“新的”或者有更新,我们希望将其添加到仓库。

目前处理计划如下:

         ~ read CSV file into mySQL table A
         ~ is primary key on A on old-A? If it isnt set record status to "NEW"
         ~ if key is on old-A, issue update statement , JOINING old-A to A
         ~ if A.field1 = old-A.field1 OR A.field2 = A.old-A.field2 OR A.field3 = old-A.field3 THEN flag  record status as "UPDATE"
         ~ process NEW or UPDATEd records according to record status

A和旧A上的文件大小目前大约为50M记录。我们希望新记录为1M,更新为5-10M。

虽然我们目前正在使用MYSQL进行此处理,但我想知道使用脚本语言执行此操作是否更好?我们特别发现标记更新的步骤非常耗时。基本上我们有一个无法使用任何索引的UPDATE语句。

所以
              创建表A(key1 bigint,
                              field1 varchar(50),                               field2 varchar(50),                               field 3 varchar(50));               加载数据......               ...将字段rec_status添加到表A.               ... 然后               更新A.               LEFT JOIN old-A ON A.key1 = old-A.key1               SET rec_status ='NEW'               WHERE old-A.key1 = NULL;               更新A.               JOIN old-A ON A.key1 = old-A.key1               SET rec_status ='更新'               在哪里A.field1<>老A.field1                  或A.field2<>老A.field2                  或A.field3<>老A.field3;                 ......

1 个答案:

答案 0 :(得分:0)

我会考虑跳过“旗帜”一步。使用脚本或MySql表A处理CSV文件使用MySQL语句,根据任何标准从old-A表中选择一条记录,例如表A的field1,或/和field2 ...,如果找到,则锁定并更新old-记录,从CSV或表A中删除已处理的记录。如果未找到,则在旧A中创建包含数据的记录。