Chinaunix

标题: 为什么mysql的update有时候会变得狂慢 [打印本页]

作者: guowei_78    时间: 2004-12-15 12:14
标题: 为什么mysql的update有时候会变得狂慢
情况是这样的:
有20张表在同一台机上的同一个mysql下,每个表是百万数量级的记录,写一个测试程序对这些表不停的做insert和update操作,insert和update的比例是9:1,过几十秒就会停在一条update语句上,很长时间无法继续(但不是每一条update都这样),正常的update语句大概零点几毫秒,但是那些停下来等很长时间的update往往要花好几分钟。

请问一下对这种情况有没有合理的解释?有什么解决办法?
作者: odin_free    时间: 2004-12-15 12:42
标题: 为什么mysql的update有时候会变得狂慢
是不是锁死了

最好降低单表记录数,还有减少索引
作者: sanda1    时间: 2004-12-15 12:51
标题: 为什么mysql的update有时候会变得狂慢
你是不是用的win32呀!
作者: guowei_78    时间: 2004-12-15 13:21
标题: 为什么mysql的update有时候会变得狂慢
应该不是锁表的缘故,因为这是一个测试程序,同一时间就只有这一个程序在访问这些表
降低单表记录数是个办法,因为单表记录数过大引起操作变慢也可以理解,但问题是为什么会变得这么慢,而且也不是每条update语句都这样,正常的update也是非常快的。
另外,为什么减少索引会有用?

原帖由 "odin_free" 发表:
是不是锁死了

最好降低单表记录数,还有减少索引

作者: guowei_78    时间: 2004-12-15 13:28
标题: 为什么mysql的update有时候会变得狂慢
应该不是锁表的缘故,因为这是一个测试程序,同一时间就只有这一个程序在访问这些表
降低单表记录数是个办法,因为单表记录数过大引起操作变慢也可以理解,但问题是为什么会变得这么慢,而且也不是每条update语句都这样,正常的update也是非常快的。
另外,为什么减少索引会有用?

原帖由 "odin_free" 发表:
是不是锁死了

最好降低单表记录数,还有减少索引

作者: carken    时间: 2004-12-15 15:01
标题: 为什么mysql的update有时候会变得狂慢
贴出有问题的Update语句看一下
作者: guowei_78    时间: 2004-12-15 16:55
标题: 为什么mysql的update有时候会变得狂慢
用的是linux,slaceware

[quote]原帖由 "sanda1"]你是不是用的win32呀![/quote 发表:

作者: guowei_78    时间: 2004-12-15 17:07
标题: 为什么mysql的update有时候会变得狂慢
就是这个样子
update t_report set Freport_result = 0, Freport_err_detail = 'DELIVRD', Fmodify_time = '20041214100816', Freport_time = '20041214102231', Fstate  = 0 where  Fstation='hbgmcc' and Fmatchseqno=7562012 and Fseqno=1813920 limit 1;



[quote]原帖由 "carken"]贴出有问题的Update语句看一下[/quote 发表:

作者: carken    时间: 2004-12-15 17:15
标题: 为什么mysql的update有时候会变得狂慢
原帖由 "guowei_78" 发表:
就是这个样子
update t_report set Freport_result = 0, Freport_err_detail = 'DELIVRD', Fmodify_time = '20041214100816', Freport_time = '20041214102231', Fstate = 0 where Fstation='hbgmcc' and Fmatchseqno=7562012 and Fseqno=1813920 limit 1;

我的语句和你差不多,跟新6个字段,关键字有4个,和你的比只是少了'limit 1'一句,更新一个30多万记录的表用0.02秒,你可否去掉limit 1试试
作者: guowei_78    时间: 2004-12-15 17:25
标题: 为什么mysql的update有时候会变得狂慢
原来是没有用limit的,也是那个问题,后来以为更新太多会有影响才加上limit的
我的不出问题的update语句应该跟你的那个速度差不多,就是搞不明白为什么会有时候就变得那么慢

原帖由 "carken" 发表:

我的语句和你差不多,跟新6个字段,关键字有4个,和你的比只是少了'limit 1'一句,更新一个30多万记录的表用0.02秒,你可否去掉limit 1试试

作者: sanda1    时间: 2004-12-15 17:28
标题: 为什么mysql的update有时候会变得狂慢
估计是软件环境的问题
作者: guowei_78    时间: 2004-12-15 17:36
标题: 为什么mysql的update有时候会变得狂慢
能说具体点么?
我现在是一点头绪都没有

[quote]原帖由 "sanda1"]估计是软件环境的问题[/quote 发表:

作者: carken    时间: 2004-12-15 17:41
标题: 为什么mysql的update有时候会变得狂慢
我想问,你的这条语句是有时会很慢还是说只要跑到这条就一定会慢?还有你说的正常的update语句和不正常的都是更新同一个表吗?数据库用的是MyISAM还是Innodb?
作者: guowei_78    时间: 2004-12-15 17:49
标题: 为什么mysql的update有时候会变得狂慢
是这样的,我只是在做测试,测试在该记录数量级的表上mysql的一些操作的性能,所以我用的update语句都是一样,只是随机的分布到20个表中去,对每个表都是有可能发生很慢的情况的,在每个表上也都有正常的情况。

[quote]原帖由 "carken"]我想问,你的这条语句是有时会很慢还是说只要跑到这条就一定会慢?还有你说的正常的update语句和不正常的都是更新同一个表吗?[/quote 发表:

作者: carken    时间: 2004-12-15 17:53
标题: 为什么mysql的update有时候会变得狂慢
数据库用的是MyISAM还是Innodb?
作者: guowei_78    时间: 2004-12-15 18:03
标题: 为什么mysql的update有时候会变得狂慢
是innodb的

[quote]原帖由 "carken"]数据库用的是MyISAM还是Innodb?[/quote 发表:

作者: carken    时间: 2004-12-15 20:52
标题: 为什么mysql的update有时候会变得狂慢
因为我一直在windows2000下开发的,不知道和linux有没有大的区别,如果是Innodb的话,我建议你参考一下my-innodb-heavy-4G.ini,或者看看my-template.ini有很详细的设定解析
作者: yejr    时间: 2004-12-15 22:26
标题: 为什么mysql的update有时候会变得狂慢
explain select * from t_report where Fstation='hbgmcc' and Fmatchseqno=7562012 and Fseqno=1813920 limit 1;

把结果贴上来看看
作者: guowei_78    时间: 2004-12-16 09:01
标题: 为什么mysql的update有时候会变得狂慢
+----------------+------+---------------+---------+---------+-------+-------+-------------+
| table          | type | possible_keys | key     | key_len | ref   | rows  | Extra       |
+----------------+------+---------------+---------+---------+-------+-------+-------------+
| t_report | ref  | station       | station |      10 | const | 77094 | Using where |
+----------------+------+---------------+---------+---------+-------+-------+-------------+

原帖由 "yejr" 发表:
explain select * from t_report where Fstation='hbgmcc' and Fmatchseqno=7562012 and Fseqno=1813920 limit 1;

把结果贴上来看看

作者: guowei_78    时间: 2004-12-16 09:04
标题: 为什么mysql的update有时候会变得狂慢
这两个文件从哪里可以得到?
另外,会不会机器性能会对这个有影响?

[quote]原帖由 "carken"]因为我一直在windows2000下开发的,不知道和linux有没有大的区别,如果是Innodb的话,我建议你参考一下my-innodb-heavy-4G.ini,或者看看my-template.ini有很详细的设定解析[/quote 发表:

作者: odin_free    时间: 2004-12-16 09:52
标题: 为什么mysql的update有时候会变得狂慢
这个贴不错啊~~
作者: guowei_78    时间: 2004-12-16 11:08
标题: 为什么mysql的update有时候会变得狂慢
要是能解决我的问题那才是真的不错
不然我真的要被逼疯了 :em12:


[quote]原帖由 "odin_free"]这个贴不错啊~~[/quote 发表:

B0AE121FB7B16364FD10B049BA805B6A.JPG (11.39 KB, 下载次数: 73)

B0AE121FB7B16364FD10B049BA805B6A.JPG

作者: carken    时间: 2004-12-16 11:32
标题: 为什么mysql的update有时候会变得狂慢
原帖由 "guowei_78" 发表:
这两个文件从哪里可以得到?
另外,会不会机器性能会对这个有影响?

mysql的两个设定文件,你把my.jpg改为my.rar,其中有我所说的两个文件

my.jpg

12.65 KB, 下载次数: 32


作者: guowei_78    时间: 2004-12-16 15:05
标题: 为什么mysql的update有时候会变得狂慢
我觉得还是有可能是机器性能的问题,把访问同一台机器上其它mysql的几个测试程序停掉以后,那些变慢的update语句由原来的几分钟变成了几十秒。
但是仍然不明白是是:即使有大量的磁盘读写操作,也不应该变得这么慢啊,而且为什么只是update语句有这种问题,insert就没有呢?
作者: carken    时间: 2004-12-16 15:25
标题: 为什么mysql的update有时候会变得狂慢
我也做过这样的测试,一台服务器,C1.7CUP,256M内存,普通7200转硬盘,windows2000SP4,MySQL4.1.7,4个database,20个表(我没有用Innodb,用的是MyISAM,因为MyISAM比Innodb便宜一半),每个表记录数在10~30万左右,4台client一起跑测试程序,每个client每次随机对一个表操作,每insert1000条记录跑一次update,一次update大概100至800条记录不等,从来没超过一秒的,你的机器应该不会比我的差吧
作者: guowei_78    时间: 2004-12-16 15:50
标题: 为什么mysql的update有时候会变得狂慢
机器是比你的好,但是数据量比你多,单表有好几百万
好像mysql在数据量超过百万时性能下降很快

[quote]原帖由 "carken"]我也做过这样的测试,一台服务器,C1.7CUP,256M内存,普通7200转硬盘,windows2000SP4,MySQL4.1.7,4个database,20个表(我没有用Innodb,用的是MyISAM,因为MyISAM比Innodb便宜一半),每个表记录数在10~30万左右,4台client一..........[/quote 发表:

作者: carken    时间: 2004-12-16 15:53
标题: 为什么mysql的update有时候会变得狂慢
那我试试百万条记录看看
作者: 618816    时间: 2004-12-16 16:44
提示: 作者被禁止或删除 内容自动屏蔽
作者: carken    时间: 2004-12-16 16:53
标题: 为什么mysql的update有时候会变得狂慢
3000千万记录如果按我的表结构,单表就有6~7G了
作者: guowei_78    时间: 2004-12-16 17:25
标题: 为什么mysql的update有时候会变得狂慢
insert操作好像是没什么问题,只有update有时候会这样
而且是不停的发送语句一条完了接下一条,语句随机分布倒20张单表几百万的表里去的

原帖由 "618816" 发表:
DESC t_report ;

把结果贴出来看一下!

我在毒龙800,内存196的情况下还插入过3000千万的记录呢!

作者: guowei_78    时间: 2004-12-16 17:31
标题: 为什么mysql的update有时候会变得狂慢
我的20张表加起来应该有一亿多条了
大概占空间4、5十G
tmd怎么会这么大

[quote]原帖由 "carken"]3000千万记录如果按我的表结构,单表就有6~7G了[/quote 发表:

作者: carken    时间: 2004-12-16 17:43
标题: 为什么mysql的update有时候会变得狂慢
原帖由 "guowei_78" 发表:
我的20张表加起来应该有一亿多条了
大概占空间4、5十G
tmd怎么会这么大

我的硬盘只有40G,所以不可以搞得太大
作者: yejr    时间: 2004-12-16 20:43
标题: 为什么mysql的update有时候会变得狂慢
[quote]原帖由 "guowei_78"][/quote 发表:


查询的3个条件中只有一个有索引,慢是当然的了。
表结构贴上来看看。
show create table t_report;
作者: odin_free    时间: 2004-12-17 09:08
标题: 为什么mysql的update有时候会变得狂慢
[quote]原帖由 "guowei_78" 发表:
我觉得还是有可能是机器性能的问题,把访问同一台机器上其它mysql的几个测试程序停掉以后,那些变慢的update语句由原来的几分钟变成了几十秒。
但是仍然不明白是是:即使有大量的磁盘读写操作,也不应该变得这么慢
作者: stonerose    时间: 2004-12-17 10:55
标题: 为什么mysql的update有时候会变得狂慢
感觉是索引的问题
作者: guowei_78    时间: 2004-12-17 11:42
标题: 为什么mysql的update有时候会变得狂慢
版主说得好,我一直也是建议减小表容量的
不过是否采纳也不是我能说了算,毕竟是给人家打工的,而且领导有时候也有点不可理喻
多谢版主到别的地方帮我请教牛人,有什么建议也麻烦贴过来
谢谢!

原帖由 "odin_free" 发表:



当然跟机器性能有关,但是频繁出现个别意外就肯定是软件有问题
其实这个问题如果说要个解释容易,可以偏差(偏差的意思约等于莫须有)的归结为mysql的性能问题~
作为研究,当然是积极探讨它的具体原因比较好?.........

B0AE121FB7B16364FD10B049BA805B6A.JPG (11.39 KB, 下载次数: 64)

B0AE121FB7B16364FD10B049BA805B6A.JPG

作者: guowei_78    时间: 2004-12-17 11:47
标题: 为什么mysql的update有时候会变得狂慢
可是如果是因为索引的原因导致慢,应该每条语句都会慢,而不是像现在这样多数语句是好的,只有少数update语句会突然变得很慢

原帖由 "yejr" 发表:


查询的3个条件中只有一个有索引,慢是当然的了。
表结构贴上来看看。
show create table t_report;

作者: odin_free    时间: 2004-12-17 12:50
标题: 为什么mysql的update有时候会变得狂慢
en 索引越多会导致写操作更慢 不是更快

读操作倒是能快




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2