我将更改我的应用程序,以便它进行批量插入而不是单个插入,以减轻服务器上的负载。我不确定做这件事的最好办法是什么。到目前为止的想法是:
-
使用一个文本文件并将所有插入/更新语句写入该文件并每5分钟处理一次-我不确定处理此文件的最佳方法。当主进程仍在尝试向其添加更多语句时,从一个进程中读取(以创建大容量插入)是否会导致问题?我需要每5分钟创建一个新文件,并在处理后删除它吗?
-
将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
- 我认为你应该每隔5分钟创建一个新文件,分别插入和更新,并在处理后删除。
-
批量插入
- 你可以在表上使用LOAD DATA INFILE和禁用键。
- 如果你使用innodb,你应该在事务中运行所有插入,以防止在每个查询上刷新索引,并使用多个VALUES(),(),()。
- 如果你使用MyIsam,你应该插入延迟选项。此外,如果你不从表中删除行,它可能有并发读/写。
-
对于批量更新,你应该使用transaction,因为你会得到同样的效果。