我有一个页面,用户可以导入他们的联系人。最初它工作得很好,最多可达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
我还尝试增加缓冲区限制,缓存限制但在那里也没有成功。
答案 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特权......