2011-08-23 96 views
1

我将更改我的应用程序,以便它可以批量插入而不是单个插入来缓解我的服务器上的负载。我不确定最好的方式去做这件事。思想至今都:如何对插入进行队列以创建批量插入

  1. 使用文本文件,并写入所有的插入/更新语句这个文件并处理它每隔5分钟 - 我不知道来处理这一个最好的办法。当主进程仍在尝试向其添加更多语句时,从一个进程(创建批量插入)读取会产生问题吗?我需要每5分钟创建一个新文件,并在处理完成后删除它。

  2. 将插入存储在会话中,然后只处理它们。这会造成记忆效应的问题吗?

我在MyISAM表中使用PHP和MySQL。我接受所有关于处理这个问题最好方法的想法,我只知道我需要停止做单个插入/更新。

谢谢。

+2

哪里是从和频率来这个数据?此外,DB *需要更新多久? – NullUserException

+0

@Null - 数据需要每5分钟更新一次。在繁忙时间每秒钟大约有100个插页。它基本上来自正在使用的脚本的日志。 – webnoob

+4

选项3:将数据写入根本没有索引的临时表(最小写入开销),然后按计划基础转移到实际表。 –

回答

0
  1. 我想你应该创建一个新的文件,每5分钟插入和更新单独处理后删除。
  2. 对于批量插入

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

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