我有一个快速增长的、写入负载较重的PHP/MySql应用程序,每秒向包含数百万行的INNODB表中插入十几个新行。
我最初使用实时INSERT语句,然后转而使用PHP的file_put_contents将条目写入文件,并使用LOAD DATA INFILE将数据导入数据库。哪种方法更好?
还有其他可供考虑的选择吗?我该如何预计这两种方法在未来处理冲突和增加负载的情况下的表现?
谢谢!
我有一个快速增长的、写入负载较重的PHP/MySql应用程序,每秒向包含数百万行的INNODB表中插入十几个新行。
我最初使用实时INSERT语句,然后转而使用PHP的file_put_contents将条目写入文件,并使用LOAD DATA INFILE将数据导入数据库。哪种方法更好?
还有其他可供考虑的选择吗?我该如何预计这两种方法在未来处理冲突和增加负载的情况下的表现?
谢谢!
将LOAD DATA INFILE
视为批量插入数据的方法。它消除了启动每个语句的插入查询的开销,因此速度更快。但是,在处理错误时,您会失去一些控制。与文件中间的一行相比,处理单个插入查询上的错误要容易得多。
INSERT DELAYED
可能是一个选项。INSERT DELAYED
的数据,则可以查看将更改复制到专用从属机器。听起来你不应该使用innoDB。无论如何,每秒十几个插入操作即使在糟糕的硬件上也不应该有问题——除非可能你的数据模型非常复杂,但对于这种情况,LOAD DATA INFILE非常好,因为它只在第一次插入时重建索引,而不是每次插入都要重建索引。因此,使用文件是一个不错的方法,但请确保以追加模式打开它们。
从长远来看(每秒1k+的写入),请查看其他数据库——特别是针对写入密集型应用程序的cassandra。
LOAD DATA
由于安全原因在一些服务器上被禁用:
http://dev.mysql.com/doc/mysql-security-excerpt/5.0/en/load-data-local.html
而且我不喜欢为了维护数据库完整性而倒置编写我的应用程序。