【问题标题】:mysql is taking too long to insert rows [closed]mysql插入行的时间太长[关闭]
【发布时间】:2011-05-28 01:19:50
【问题描述】:

我有一个页面,用户可以在其中导入他们的联系人。最初它在最多 3000 个联系人时工作正常,但是当我尝试导入 10000 个联系人时,它开始花费太多时间,现在的情况是,即使是 100 个联系人,它也花费了太多时间。我尝试了mysqlmy.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

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

【问题讨论】:

  • @Sujit:不需要那样的语气。我在和你辩护的尼克说话。
  • 问题含糊。什么是“太多时间”?性能分析仪说什么?你的数据库的结构是什么?你要插入什么数据?什么存储引擎?
  • @Sujit:在评论中只回答我的一个查询(而不是在问题中提供 all 必要的信息)没有帮助。投票结束。
  • 您正在使用的行数绝对没有。带有 innodb 的 Mysql 将适用于具有数百万条记录的表而没有问题。你存储的是什么类型的数据?你一定在某个地方遇到了巨大的瓶颈
  • @Sujit:到目前为止,您的所有问题都获得了反对票(除了一个得分为 0 的问题)。我建议您阅读 Stack Overflow 常见问题解答并查看一些评分较高的问题,以了解此处认为什么是“好”问题。

标签: mysql


【解决方案1】:

不要自动假设您的服务器设置错误。默认设置可能没问题。插入 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:很好的建议和很好的例子。你知道在复合插入语句中可以连接多少组值吗?
  • INSERT INTO mytable (id, name) VALUES 这个方法我正在使用
  • 只是为了确定:我不是在谈论“值”语法。您是一次发送多个值,还是为每一行发送INSERT INTO ....?
  • 我已经修改了示例以消除混淆。 Sujit,你能不能再用你现在看到的来回答:你是用第一种方法还是第二种方法?无论如何,如果是第一种,那就开始使用第二种方法。尝试像这样以 1000 行左右的块发送数据。这应该会给您的进口带来巨大的推动作用。
  • @wounder 一次获得多个值。我知道没有人能够解决这个问题。和在此处发布此问题之前一样,我对几乎所有替代方案进行了很多试验,但我认为这个专家论坛中的一些人可能会有所帮助。但我得到了反对票。非常失望
【解决方案2】:

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

参考。 MySql 5.5 Documentation:

此功能可以激活 显式地用于 MyISAM 表。改变 TABLE ... DISABLE KEYS 告诉 MySQL 停止更新非唯一索引。改变 TABLE ... ENABLE KEYS 然后应该是 用于重新创建丢失的索引。 MySQL 用一个特殊的方法来做到这一点 比它快得多的算法 一个一个地插入键,所以 在执行批量操作之前禁用键 插入操作应该给出一个 可观的加速。使用 ALTER TABLE ... DISABLE KEYS 需要 INDEX 权限...

【讨论】:

  • +1.. 好建议。即使我认为 Sujit 不再在听(他没有回答我的问题),并且通过查看他的其他问题,我认为他不会回到这个页面。但我将 SO 视为某种 wiki。有一天,有人会通过 Google 访问此页面,而您的回答会很有帮助。
  • 我发现这个页面很有用!我有一个类似的问题。我必须每 5 天插入/比较每个用户大约 500 行数据。发现这篇文章很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 2012-01-13
  • 2023-02-14
  • 2015-11-28
相关资源
最近更新 更多