2011-08-23 53 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