2011-05-28 100 views
3

我有一個頁面,用戶可以在其中導入他們的聯繫人。最初它可以正常工作到3000個聯繫人,但是當我嘗試導入10000個聯繫人時,它開始花費太多時間,現在情況是,即使是100個聯繫人也需要太多時間。我嘗試了mysqlmy.cnf文件,並將最大數據包大小增加到256 MB。我的php.ini最大上傳限制是512 MB,內存限制是512 MB。我嘗試了幾種方法來解決這個問題,但沒有成功。mysql插入行的時間太長

my.cnf

[mysqld] 
set-variable = max_connections=500000 
log-slow-queries 
safe-show-database 
local-infile=0 
max_allowed_packet=256M 

我也試圖增加緩衝區限制,高速緩存限制,但要麼沒有成功那裏。

+0

什麼引擎?表中目前有多少行。 – Layke 2011-05-28 01:22:38

+0

先生它的MySQL和爲什麼你已經給予否定的投票它目前最關鍵的情況之一,如果rown = s在那裏,如果我們正在導入3000行它工作正常,但我們儘量試圖導入10000行整個mysql成爲對於特定的數據庫而言永久慢。即使是100行,也需要1個多小時。我試過所有類型的替代方案,因爲它是一個專家人士論壇,我期望得到解決,但它不是一個容易的不給 - 如果你不能解決問題,我們將投票 – 2011-05-28 01:32:03

+0

@nick:他的任何問題都沒有正數票數。我沒有看過他們,但如果沒有可以接受的答案,我不會感到驚訝。 – 2011-05-28 01:33:04

回答

14

不要自動假定您的服務器設置錯誤。默認設置可能很好。插入10000行應該是一塊蛋糕,即使在一臺舊機器上,但這取決於你如何做插入。

在這裏,我將介紹3種方法將數據插入,從慢到快:

以下是如果你有很多行插入極其緩慢:

INSERT INTO mytable (id,name) VALUES (1,'Wouter'); 
INSERT INTO mytable (id,name) VALUES (2,'Wouter'); 
INSERT INTO mytable (id,name) VALUES (3,'Wouter'); 

這已經是一個很大速度快:

INSERT INTO mytable (id, name) VALUES 
    (1, 'Wouter'), 
    (2, 'Wouter'), 
    (3, 'Wouter'); 

(編輯錯誤的語法)

這是usua LLY最快:

有CSV文件看起來像這樣:

1,Wouter 
2,Wouter 
3,Wouter 

然後運行像

LOAD DATA FROM INFILE 'c:/temp.csv' INTO TABLE mytable 

你使用哪種上述方法?

+1

+1:偉大的建議,很好的例子。你知道在複合插入語句中你可以連接多少組值嗎? – IAbstract 2011-05-28 02:00:40

+0

INSERT INTO mytable(id,name)VALUES 我使用的這種方法 – 2011-05-28 02:06:58

+0

只是爲了確定:我不是在談論「values」語法。你是否一次發送多個值,或者你是否爲每一行發送'INSERT INTO ....'? – 2011-05-28 02:13:35

6

除了@Wouter提供的建議,你應該檢查你的索引。如果要插入10k +行,則可能需要在插入過程之前禁用鍵。不要忘記隨後啓用密鑰。

ref。 MySql 5.5 Documentation

此功能可以爲MyISAM表格顯式激活 。 ALTER TABLE ... DISABLE KEYS告訴MySQL到 停止更新非唯一索引。 ALTER TABLE ... ENABLE KEYS然後應該是 用於重新創建缺少的索引。 MySQL不會把這個具有特殊 的算法,比 鍵插入一個接一個,所以 禁用鍵更快執行批量 插入操作應該給 相當大的加速前。使用ALTER TABLE ... DISABLE KEYS要求 INDEX權限...

+3

+1 ..好的建議。儘管我認爲Sujit不再聽(他不回答我的問題),並且通過查看他的其他問題,我不認爲他會回到本頁。但我把它看成是某種維基。有一天有人會通過谷歌到達這個頁面,你的回答會有幫助。 – 2011-05-28 02:26:34

+0

我覺得這個網頁很實用!我有一個類似的問題。我必須每5天一次插入/比較大約500行數據。找到這篇文章非常有用。 – 2012-07-02 21:02:08