2015-11-20 128 views
2

我有一個簡單的表測試有三個欄插入1萬條記錄中花費過多時間MYSQL

id -> primary key (auto increment) 
name -> varchar 
age -> int 

我用一個簡單的存儲過程來填充表1萬個數據。

drop PROCEDURE if EXISTS big_data; 
CREATE PROCEDURE big_data() 
BEGIN 
    DECLARE i int DEFAULT 1; 
    WHILE i <= 10000000 DO 
     INSERT INTO test(id, name, age) VALUES (i, 'name', 34); 
     SET i = i + 1; 
    END WHILE; 
END; 

CALL big_data(); 

問題我面臨的是將100萬條記錄正在採取近6〜7小時,這個簡單的模式。我想知道如何快速插入數據? 我不想使用LOAD DATA INFILE查詢,我沒有更改my.ini文件中的任何設置。

只想知道插入太慢的原因?

系統規範

Mysql version 5.5.25a 
    innodb_version =1.1.8 
    System = 16GB RAM/8 cores @ 2.70 GHz 
+1

考慮到這是一種插入數據的非常低效的方式,您的數據庫實際上是在每秒插入幾百行數據。它沒有那麼壞。考慮到機器上的大多數內核對這種串行插入沒有好處(它是單線程的)......簡而言之,由於您使用的數據庫錯誤,所以速度很慢。 –

+0

我沒有得到您使用錯誤的數據庫@AssafLavie 的觀點,並且還建議我使用有效的方式插入數據? – Ali

+1

不是錯誤的分貝,但使用分貝錯誤的方式。批量插入或LOAD DATA。這就是它的目的。 –

回答

-1

試着讓你的查詢作爲單一字符串,然後立刻執行它

drop PROCEDURE if EXISTS big_data; 
CREATE PROCEDURE big_data() 
BEGIN 
    DECLARE total_count TEXT DEFAULT ''; 
    DECLARE i int DEFAULT 1; 
    WHILE i <= 10000000 DO 
     SET total_count = total_count + '(' + i+ ', name, 34),'; 
     SET i = i + 1; 
    END WHILE; 
    SET total_count = TRIM(TRAILING ',' FROM total_count); 
    INSERT INTO test(id, name, age) VALUES ' + total_count; 
END; 
0

同時插入100行是10倍的速度爲100 1行INSERTs

INSERT INTO FOO(A,b,C) VALUES (1,2,3), (4,5,6),...;

LOAD DATA可能更快。