2010-06-22 41 views
3

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

最初我在做个别的INSERT查询,我意识到这是非常低效的(约6000个查询几乎要花费2分钟)。然后我生成了一个大的查询,并一次性编辑了所有的数据。这给我们提高了3400%的效率,并将查询时间减少到刚好超过3秒

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

我知道数以千计的大部分数字数据在事物的宏观方案中并不是很多,但我试图让这个Intranet应用程序尽可能快速/快速响应。而且我还想确保在我们决定将该计划授权给其他公司的情况下,此流程可以扩大规模。

UPDATE:

所以我没有继续前进,测试LOAD DATA INFILE出的建议,认为它会给我只边际速度增加(因为我现在正在写相同数据到磁盘的两倍),但我是当它将查询时间从3300ms降低到〜240ms时感到惊讶。该页面仍然需要大约1500毫秒才能执行总计,但仍然比以前明显更好。

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

+1

我知道这个问题是在几年前发布的,但我不得不说,一个批量INSERT和LOAD DATA INFILE之间的区别是节省时间。我使用INSERT从30秒/秒增加到10秒,使用30列CSV文件加载~11000行。 – 2013-11-19 15:56:10

回答

4

LOAD DATA INFILE速度非常快,并且是将文本文件导入MySQL的正确方法。它是用于数据-up的插入加快20倍的速度推荐的方法之一,根据该:

http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

假设写入处理的数据返回到文本文件是不是插入它快进入数据库,那么这是一个好方法。

1

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

当然,你会想要做一些基准测试,但我认为这是值得写一些测试代码。

3

LOAD DATA或多个插入将比单插入好得多; LOAD DATA可以为你节省一点点你可能不太在意的事情。

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

大部分时间做一个大插入将来自建立索引,这是一个昂贵的和内存密集型操作。

如果您需要的性能,

  • 有尽可能
  • 确认表及其所有索引适合你的InnoDB缓冲池(这里假设InnoDB的)
  • 只需添加更多的内存为几个指标直到你的桌子适合内存,除非这变得过于昂贵(现在的64G不是太贵)

如果你必须使用MyISAM,那里有几个肮脏的窍门这更好,我不会进一步讨论。

2

伙计们,我有同样的问题,我的需求可能比一般更具体一点,但我写了一篇关于我的发现的文章。

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

我需要加载的数据是快,但需要保存到一个平面文件上飞意味着平均负载倍批量插入所花的时间。此外,我并不需要做超过200次的查询,在此之前,我一次只做一次,现在我正在使用它,时间节省在几秒钟之内。

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

+0

有趣。这对于许多用例来说绝对是好事,尽管我对你如何得到0.0013sec的数字有点困惑。 (我不擅长统计。) – 2011-03-10 04:30:55

+1

Lese:这是关于标准偏差的。我对标准差的理解是它显示了平均值有多少差异。 (Excel为我做了计算)。我的观点是体积的标准偏差小于载荷数据的标准偏差。对我而言,这意味着BULK的速度最快。在决定这一点时,哪一个对我来说是最重要的因素。主要是因为这是在一个现场。 希望这有道理?查看更多信息:http://en.wikipedia.org/wiki/Standard_deviation – Andy 2011-03-11 10:29:22