所以我正在尝试将一些销售数据导入我的MySQL数据库。数据最初采用原始CSV文件的形式,我的PHP应用程序需要首先处理该文件,然后将处理后的销售数据保存到数据库中。
最初我正在进行单独的INSERT
查询,我意识到这些查询非常低效(~6000次查询几乎 2分钟)。然后,我生成了一个大型查询,并INSERT
同时编辑了所有数据。这使我们的效率提高了3400%,并将查询时间缩短到超过 3秒。
但据我了解,LOAD DATA INFILE
应该比任何类型的INSERT
查询更快。所以现在我正在考虑将处理过的数据写入文本文件,并使用LOAD DATA INFILE
将其导入数据库。这是将大量数据插入数据库的最佳方式吗?或者我完全以错误的方式解决这个问题?
我知道几千行主要是数字数据在宏观方案中并不是很多,但我正在努力使这个内部网应用程序尽可能快速/响应。我还想确保在我们决定将该计划授权给其他公司的情况下,此流程可以扩展。
更新
所以我确实按照建议继续测试LOAD DATA INFILE
,认为它可能只给我边际速度增加(因为我现在将相同的数据写入磁盘两次),但是当它切割时我很惊讶查询时间从超过3300ms到~240ms。该页面总共需要大约1500毫秒来执行,但它仍然比以前明显更好。
从这里我想我会检查数据库中是否有任何多余的索引,并且,由于除了我的两个表之外的所有表都是InnoDB,我将研究优化InnoDB缓冲池以优化整体性能。
答案 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行通常感觉正确(注意:这与非交易引擎无关)。如果您的交易太小,那么它会花费所有时间将日志同步到光盘。
大部分时间进行大量插入都将来自构建索引,这是一项昂贵且占用大量内存的操作。
如果您需要表演,
如果你必须使用MyISAM,那里有一些肮脏的技巧可以让它变得更好,我不会进一步讨论。
答案 2 :(得分:2)
伙计们,我有同样的问题,我的需求可能比一般情况更具体,但我在这里写了一篇关于我的发现的帖子。
http://www.mediabandit.co.uk/blog/215_mysql-bulk-insert-vs-load-data
对于我的需求,加载数据很快,但需要动态保存到平面文件意味着平均加载时间比批量插入更长。此外,我不需要做200多个查询,在我一次做这个之前,我现在正在填充它们,节省的时间在几秒钟内。
无论如何,希望这会对你有帮助吗?
答案 3 :(得分:1)
你的方法应该没问题。我不确定LOAD DATA INFILE与批量INSERT相比有多快,但我听到了同样的事情,它应该更快。
当然,你需要做一些基准来确定,但我认为值得编写一些测试代码。