mysql的插入为何那么慢?

PuppyPanda 2010-09-14 10:28:39
在自己的windows xp + mysql 5.1简单测试了一下,只是插入1000条数据,就用了24s!
update消耗的时间也少不了多少。这速度根本拿不出手啊~

该如何优化呢?
...全文
438 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjxbf 2010-10-19
  • 打赏
  • 举报
回复
高手 学习了
somemak 2010-10-18
  • 打赏
  • 举报
回复
如果插入的数据很多(例如:100W条),可以批量插入(例如:每2000条数据拼好test.sql,执行Source命令)
somemak 2010-10-18
  • 打赏
  • 举报
回复
按6楼的格式拼好test.sql,然后用source命令执行
其实就是insert的方式问题,mysql的帮助文档已经写得很清楚了。。。
(至于怎么拼好test.sql,LZ应该会了吧?)

[Quote=引用 11 楼 ichenq 的回复:]
多值插入很快,不到1秒。
不过程序需要从网络获取insert的数据,所以只能单条insert来测试。

我把这些语句放在test.sql里, 然后用source 命令执行

SQL code

insert into test.test values (1, 101);
insert into test.test values (2, 102);
insert into test……
[/Quote]
weixiaohua 2010-10-18
  • 打赏
  • 举报
回复
配置
innodb_flush_log_at_trx_commit = 2
等于
innodb_flush_log_at_trx_commit = 1

这样速度就上去了.我机器大约一秒可以插入5500条数据.
曾经的阿飞 2010-09-19
  • 打赏
  • 举报
回复
你用myisam还是innodb?两者性能差距特别大,innodb差不多是myisam的10倍(因为innodb是行级锁定)
不过你这个速度也实在是太慢了。
你把你的create table贴出来
feixianxxx 2010-09-17
  • 打赏
  • 举报
回复
你把 insert values()
insert values() ...

改成
insert Values(),()...这样的形式
  • 打赏
  • 举报
回复
从网络获取insert的数据???

可以先存在表里 等数据量到一定数直接批量传过去。
批量执行比一条条执行效率高!

PuppyPanda 2010-09-15
  • 打赏
  • 举报
回复
多谢 ACMAIN_CHM 兄一直不耐烦的解答~

不早了,该休息了。
ACMAIN_CHM 2010-09-15
  • 打赏
  • 举报
回复
[Quote]我查了下网上的资料,都说如果有大规模的update和insert的话,用innodb效率高些。
但是我这个1000次insert,我把test表换成myisam引擎后反而在1秒内完成。

这是我弄错了么?[/Quote]

你从哪下的资料?!根本没有这种说法!

INNODB也没 这么慢,delete from `test` 所有记录删除,后再试。
PuppyPanda 2010-09-15
  • 打赏
  • 举报
回复
test表的建立语句:

CREATE TABLE `test` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`value` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=latin1




我查了下网上的资料,都说如果有大规模的update和insert的话,用innodb效率高些。
但是我这个1000次insert,我把test表换成myisam引擎后反而在1秒内完成。

这是我弄错了么?
zuoxingyu 2010-09-15
  • 打赏
  • 举报
回复
插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例:

连接:(3)
发送查询给服务器:(2)
分析查询:(2)
插入记录:(1x记录大小)
插入索引:(1x索引)
关闭:(1)


从你的描述来看,可以用INSERT DELAYED语句加快速度。
ACMAIN_CHM 2010-09-15
  • 打赏
  • 举报
回复
show create table test.test ;
PuppyPanda 2010-09-15
  • 打赏
  • 举报
回复
是不是因为innodb表支持事务的特性,导致了每次update或者insert的时候多了很多额外的操作,使得查询非常慢?
PuppyPanda 2010-09-15
  • 打赏
  • 举报
回复
多值插入很快,不到1秒。
不过程序需要从网络获取insert的数据,所以只能单条insert来测试。

我把这些语句放在test.sql里, 然后用source 命令执行

insert into test.test values (1, 101);
insert into test.test values (2, 102);
insert into test.test values (3, 103);
insert into test.test values (4, 104);
insert into test.test values (5, 105);
insert into test.test values (6, 106);
insert into test.test values (7, 107);
insert into test.test values (8, 108);
insert into test.test values (9, 109);
insert into test.test values (10, 110);
insert into test.test values (11, 111);
insert into test.test values (12, 112);
insert into test.test values (13, 113);
...
insert into test.test values(999, 1999);


这样也消耗了20秒的时间。

limohao 2010-09-15
  • 打赏
  • 举报
回复
用的innodb引擎吗?
如果是请在my.ini中
配置
innodb_flush_log_at_trx_commit = 2

innodb_flush_log_at_trx_commit = 0
ddv1999 2010-09-15
  • 打赏
  • 举报
回复
这是个C++的程序设计有问题,它是一条一条进去的,但每条之间是有C的循环速度的。所以,你的时间要最少要除以2,才是真正的数据库的速度
zuoxingyu 2010-09-14
  • 打赏
  • 举报
回复

CREATE PROCEDURE dowhile()
BEGIN
DECLARE v1 INT DEFAULT 1000;

WHILE v1 > 0 DO
insert into test.test values (v1, v1);
SET v1 = v1 - 1;
END WHILE;
END;

call dowhile();


用这个存储过程试试你的插入速度。
ACMAIN_CHM 2010-09-14
  • 打赏
  • 举报
回复
如果存储过程,或者多值插入的速度不慢,则问题不在MYSQL,而在你的程序配置上。比如驱动,代码。

分析问题先从中一劈两半,减少需要分析的范围。
ACMAIN_CHM 2010-09-14
  • 打赏
  • 举报
回复
首先分清,是你的程序慢,还是MYSQL慢。
PuppyPanda 2010-09-14
  • 打赏
  • 举报
回复
有时候是不能用存储过程的。不然我何必insert 1000次,用多值的insert就好了。

现在的情况是我需要把网络上的数据插入到mysql中,它传多少我就得插入多少,如果它一次性传得太多而这边的insert又处理不过来的话,程序就卡在那里了。
加载更多回复(6)

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧