MySql INSERT与PHP file_put_contents

时间:2012-03-09 18:41:04

标签: php mysql

我有一个快速增长的,写得很重的PHP / MySql应用程序,它以每秒十几个左右的速率将新行插入到数百万行的INNODB表中。

我开始使用实时INSERT语句,然后转移到PHP的file_put_contents以将条目写入文件和LOAD DATA INFILE以将数据导入数据库。哪种方法更好?

我应该考虑哪些替代方案?我怎么能期望这两种方法在未来处理冲突和增加负载?

谢谢!

6 个答案:

答案 0 :(得分:3)

LOAD DATA INFILE视为插入数据的批处理方法。它消除了为每个语句启动插入查询的开销,因此速度更快。但是,在处理错误时会丢失一些控件。在单个插入查询中处理错误要比在文件中间处理一行容易得多。

答案 1 :(得分:2)

根据您是否能够承担由PHP插入的数据而无法立即在表格中使用,INSERT DELAYED可能是一个选项。

MySQL将接受要插入的数据,稍后将处理插入,并将其放入队列中。因此,当MySQL确保稍后插入数据时,这不会阻止您的PHP应用程序。

As it says in the manual:

  

使用INSERT DELAYED的另一个主要好处是来自许多客户端的插入被捆绑在一起并写在一个块中。这比执行许多单独的插入要快得多。

我已经使用它来记录数据丢失并不致命的数据但是如果你想要保护来自INSERT DELAYED的数据尚未插入的服务器崩溃,你可以考虑复制这些更改到专用的奴隶机器。

答案 2 :(得分:0)

我们处理插入的方式是将它们发送到像ActiveMQ这样的消息队列系统。从那里我们有一个单独的应用程序,使用LOAD DATA INFILE以大约5000的批量加载插入。错误处理仍然可以使用infile进行,但是它可以更快地处理插入。如果设置消息队列超出了应用程序的范围,则没有理由认为file_put_contents不是可接受的选项 - 特别是如果它已经实现并且工作正常。

此外,您可能希望在写入期间测试禁用索引,以查看是否可以提高性能。

答案 3 :(得分:0)

听起来你应该使用innoDB。无论如何,即使对于糟糕的硬件,每秒十几个插入也不会有问题 - 除非您的数据模型非常复杂,但为此,LOAD DATA INFILE非常好,因为除其他外,它只重建索引一次,而不是每个插入物。因此,使用文件是一种不错的方法,但请确保以仅附加模式打开它们。

从长远来看(1k +写入/秒),请查看其他数据库 - 特别是cassandra用于写入繁重的应用程序。

答案 4 :(得分:0)

如果你去sql insert路由,请在事务中包装pdo execute语句。这样做会大大加快这个过程。

答案 5 :(得分:-1)

出于安全原因,在某些服务器上禁用了

LOAD DATA

http://dev.mysql.com/doc/mysql-security-excerpt/5.0/en/load-data-local.html

此外,我不喜欢颠倒编写我的应用程序以保持数据库完整性。