将批量数据导入MySQL

时间:2010-06-22 20:14:57

标签: php mysql performance bulkinsert

所以我正在尝试将一些销售数据导入我的MySQL数据库。数据最初采用原始CSV文件的形式,我的PHP应用程序需要首先处理该文件,然后将处理后的销售数据保存到数据库中。

最初我正在进行单独的INSERT查询,我意识到这些查询非常低效(~6000次查询几乎 2分钟)。然后,我生成了一个大型查询,并INSERT同时编辑了所有数据。这使我们的效率提高了3400%,并将查询时间缩短到超过 3秒

但据我了解,LOAD DATA INFILE应该比任何类型的INSERT查询更快。所以现在我正在考虑将处理过的数据写入文本文件,并使用LOAD DATA INFILE将其导入数据库。这是将大量数据插入数据库的最佳方式吗?或者我完全以错误的方式解决这个问题?

我知道几千行主要是数字数据在宏观方案中并不是很多,但我正在努力使这个内部网应用程序尽可能快速/响应。我还想确保在我们决定将该计划授权给其他公司的情况下,此流程可以扩展。

更新

所以我确实按照建议继续测试LOAD DATA INFILE,认为它可能只给我边际速度增加(因为我现在将相同的数据写入磁盘两次),但是当它切割时我很惊讶查询时间从超过3300ms到~240ms。该页面总共需要大约1500毫秒来执行,但它仍然比以前明显更好。

从这里我想我会检查数据库中是否有任何多余的索引,并且,由于除了我的两个表之外的所有表都是InnoDB,我将研究优化InnoDB缓冲池以优化整体性能。

4 个答案:

答案 0 :(得分:4)

LOAD DATA INFILE非常快,是将文本文件导入MySQL的正确方法。根据这一点,这是加快数据插入速度提高20倍的推荐方法之一:

https://dev.mysql.com/doc/refman/8.0/en/insert-optimization.html

假设将处理后的数据写回文本文件比将其插入数据库更快,那么这是一个很好的方法。

答案 1 :(得分:3)

LOAD DATA或多个插件比单个插件要好得多; LOAD DATA为您节省了一点点,您可能根本不在乎。

在任何情况下,在一次交易中做了很多但不是太多 - 每次交易10,000行通常感觉正确(注意:这与非交易引擎无关)。如果您的交易太小,那么它会花费所有时间将日志同步到光盘。

大部分时间进行大量插入都将来自构建索引,这是一项昂贵且占用大量内存的操作。

如果您需要表演,

  • 拥有尽可能少的索引
  • 确保表及其所有索引都适合您的innodb缓冲池(假设这里是innodb)
  • 只需添加更多内存,直到你的桌子适合内存,除非这样会变得非常昂贵(现在64G并不太贵)

如果你必须使用MyISAM,那里有一些肮脏的技巧可以让它变得更好,我不会进一步讨论。

答案 2 :(得分:2)

伙计们,我有同样的问题,我的需求可能比一般情况更具体,但我在这里写了一篇关于我的发现的帖子。

http://www.mediabandit.co.uk/blog/215_mysql-bulk-insert-vs-load-data

对于我的需求,加载数据很快,但需要动态保存到平面文件意味着平均加载时间比批量插入更长。此外,我不需要做200多个查询,在我一次做这个之前,我现在正在填充它们,节省的时间在几秒钟内。

无论如何,希望这会对你有帮助吗?

答案 3 :(得分:1)

你的方法应该没问题。我不确定LOAD DATA INFILE与批量INSERT相比有多快,但我听到了同样的事情,它应该更快。

当然,你需要做一些基准来确定,但我认为值得编写一些测试代码。