2015-11-20 71 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可能更快。