mysql插入行的时间太长了

时间:2011-05-28 01:19:50

标签: mysql

我有一个页面,用户可以导入他们的联系人。最初它工作得很好,最多可达3000个联系人,但当我尝试导入10000个联系人时,它开始花费太多时间,现在的情况是,即使是100个联系人也需要花费太多时间。我尝试了mysql my.cnf文件,并将最大数据包大小增加到256 MB。我的php.ini最大上传限制为512 MB,内存限制为512 MB。我尝试了几种方法来解决这个问题但没有成功。

my.cnf

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

我还尝试增加缓冲区限制,缓存限制但在那里也没有成功。

2 个答案:

答案 0 :(得分: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');

(编辑错误的语法)

这通常是最快的:

拥有如下所示的CSV文件:

1,Wouter
2,Wouter
3,Wouter

然后运行类似

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

您使用上述哪种方法?

答案 1 :(得分:6)

除了@Wouter提供的建议外,您还应检查索引。如果要插入10k +行,则可能需要在插入过程之前禁用密钥。不要忘记以后启用密钥。

REF。 MySql 5.5 Documentation

  

可以激活此功能   明确地为MyISAM表。改变   表... DISABLE KEYS告诉MySQL   停止更新非唯一索引。改变   表...当然应该是ENABLE KEYS   用于重新创建缺失的索引。   MySQL以特殊方式完成此任务   算法比快得多   一个接一个地插入键,所以   在执行批量之前禁用密钥   插入操作应该给出一个   相当快的速度。使用ALTER   表...禁用键需要   INDEX特权......