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


How do I queue inserts to create a bulk insert

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

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

  2. 将insert存储在会话中,然后只处理它们。这会对记忆等造成问题吗?

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

谢谢。

将数据放入数据库的最快方法是在文本文件上使用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. 我认为你应该每隔5分钟创建一个新文件,分别插入和更新,并在处理后删除。
  2. 批量插入

    1. 你可以在表上使用LOAD DATA INFILE和禁用键。
    2. 如果你使用innodb,你应该在事务中运行所有插入,以防止在每个查询上刷新索引,并使用多个VALUES(),(),()。
    3. 如果你使用MyIsam,你应该插入延迟选项。此外,如果你不从表中删除行,它可能有并发读/写。
  3. 对于批量更新,你应该使用transaction,因为你会得到同样的效果。