2012-05-14 23 views
0

我有一个大数据集到MySQL(用户,公司,联系人)?约100万条记录。插入大量数据[PHP,MySQL]

现在我需要从导入文件(csv)导入新用户,公司,联系人约100000条记录。我从文件记录了所有三种精华(用户,公司,联系人)的所有信息。 而且对生产我不能使用LOAD DATA(只是没有那么多的权利:()

所以存在应被应用到数据集的三个步骤 - 与现有的DB数据 比较 - 更新(如果我们会发现在前面的步骤东西) - 并插入新的记录

我使用服务器上做这件事的PHP我可以看到两种方法:

  • 读取来自所有数据。文件,然后使用这个BIG阵列并应用这些步骤。
  • 或读取线通过从文件线和穿过步骤

哪种方法更有效的每行? CPU,内存或时间使用情况

我可以使用事务吗?否则会减慢整个生产系统?

谢谢。

+0

我不认为你需要找到最有效的方法来做到这一点。对于100K记录,最多需要20 - 30秒,并且您可能不需要再次插入这些记录... –

+0

你在开玩笑吗?我已经实现了第一种方法,它需要很多时间,我敢肯定,你无法想象它是如何工作的;) – user1016265

回答

2

CPU时间/时也不会有它,虽然读取整个文件将稍快更快。但是,对于如此庞大的数据集,将所有记录读入内存所需的额外内存将大大超过时间优势 - 我一定会一次处理一行。

+1

同意。如果需要原子性,则使用事务。 – eggyal

+0

但在这种情况下,事务应该在使用之前开始并完成,对吗? – user1016265

+0

@ user1016265取决于你在做什么。如果某些行引用同一数据集中的其他行,那么您可能想要在单个事务中包装所有行,或者至少包含在单个事务中彼此引用的组行(您可能至少需要两次传递方法这个)。如果没有对同一个表的引用并且没有循环外键,则每行一个事务可能是可接受的。 – DaveRandom

0

您是否知道phpMyAdmin对于大型SQL文件具有“可恢复导入”的漂亮功能?

只是检查在部分导入部分“允许进口的中断”。然后,PhpMyAdmin将停止并循环,直到执行完所有请求。

这可能是更有效的只是“使用工具”,而不是“另起炉灶”

+0

我怎样才能从一个单一的导入文件导入一些帮助phpMyAdmin到三个不同的表? – user1016265

+0

@ user1016265 phpMyAdmin将尝试创建表格甚至数据库,但无法确定表格“用户”何时结束以及表格“公司”何时开始。请参阅[3.18当我导入包含多个表格的CSV文件时,它们被集中到一个表格中。](http://www.phpmyadmin.net/documentation/Documentation.html#faq3_18) –

+0

我知道,但你解决方案不能在我的情况下工作。谢谢 – user1016265

0

我认为,第二个办法是更容易接受:

  1. 创建更改列表(这将是一个单独的表)
  2. 使通过线更新一致(并标记每一行使用“updflag”字段更新,例如)
  3. 使用事务在后台执行此过程。