我有一个快速增长的、编写繁重的PHP/MySql应用程序,它以每秒十几行的速度将新行插入到包含数百万行的INNODB表中。
我从使用实时INSERT语句开始,然后使用PHP语言的file_put_contents将条目写入文件,并加载DATA INFILE以将数据放入数据库。哪种方法更好?
有什么我应该考虑的替代方案吗?我如何期望这两种方法在将来处理冲突和增加负载?
谢谢!
发布于 2012-03-10 02:44:19
可以将LOAD DATA INFILE看作是插入数据的批处理方法。它消除了为每个语句触发insert查询的开销,因此速度要快得多。但是,在处理错误时,您会失去一些控制。在单个insert查询上处理错误要比在文件中间处理一行容易得多。
发布于 2012-03-10 05:14:25
根据您是否能够承受由PHP插入的数据在表中不能立即可用,那么INSERT DELAYED可能是一个选择。
MySQL将接受要插入的数据,并在稍后处理插入,将其放入队列中。因此,这不会阻塞您的PHP应用程序,而MySQL可以确保稍后插入数据。
使用插入延迟的另一个主要好处是,来自多个客户端的插入被捆绑在一起并写入到一个块中。这比执行许多单独的插入要快得多。
在数据丢失不是致命的情况下,我使用它来记录数据,但是如果您希望在尚未插入来自INSERT DELAYED的数据时避免服务器崩溃,您可以考虑将更改复制到专用的从机。
发布于 2012-03-10 02:49:41
我们处理插入的方式是将它们发送到像ActiveMQ这样的消息队列系统。从那里我们有一个单独的应用程序,它使用LOAD DATA INFILE以大约5000个为一批的方式加载插入。错误处理仍然可以与infile一起发生,但是它处理插入的速度要快得多。如果设置消息队列超出了您的应用程序的范围,那么file_put_contents没有理由不是一个可接受的选项--特别是如果它已经实现并且运行良好的话。
此外,您可能希望测试在写入期间禁用索引,以查看这是否会提高性能。
https://stackoverflow.com/questions/9639296
复制相似问题