如何对插入进行排队以创建批量插入

时间:2011-08-23 15:12:30

标签: php mysql

我将更改我的应用程序,以便它执行批量插入而不是单个插入,以减轻我的服务器上的负载。我不确定最好的办法。到目前为止的想法是:

  1. 使用文本文件并将所有插入/更新语句写入此文件并每隔5分钟处理一次 - 我不确定处理此文件的最佳方法。当主进程仍在尝试向其添加更多语句时,从一个进程读取(创建批量插入)会导致问题吗?我是否需要每隔5分钟创建一个新文件,并在处理完毕后将其删除。

  2. 将插入内容存储在会话中,然后只处理它们。这会导致记忆等问题吗?

  3. 我正在使用PHP和MySQL与MyISAM表。我对处理这个问题的最佳方法持开放态度,我只知道我需要停止单个插入/更新。

    感谢。

2 个答案:

答案 0 :(得分:1)

将数据导入数据库的最快方法是在文本文件上使用load data infile

请参阅:http://dev.mysql.com/doc/refman/5.1/en/load-data.html

当然,您也可以使用批量插入,如果您希望它们排在选择后面,请使用如下语法:

INSERT LOW PRIORITY INTO table1 (field1, field2) VALUES (1,1),(2,2),(3,3),...
or
INSERT DELAYED INTO .....

请注意,delayed不适用于InnoDB。 另请注意,使用MyISAM时不建议使用low priority

请参阅:
http://dev.mysql.com/doc/refman/5.5/en/insert.html
http://dev.mysql.com/doc/refman/5.5/en/insert-delayed.html

答案 1 :(得分:0)

  1. 我认为您应该为插入和分别更新每5分钟创建一个新文件,并在处理后删除它们。
  2. 批量插入

    1. 您可以在表格中使用带有禁用键的LOAD DATA INFILE。
    2. 如果您使用innodb,您应该在事务中运行所有插入以防止每个查询的刷新索引,并使用具有多个VALUES(),(),()的表单。
    3. 如果您使用MyIsam,则应插入DELAYED选项。此外,如果您不从表中删除行,则可以进行并发读/写。
  3. 对于批量更新,您应该使用交易,因为您将获得相同的效果。