首页 新闻 会员 周边 捐助

1个困扰我3个多月没解决的mysql性能问题

0
悬赏园豆:200 [已解决问题] 解决于 2014-07-05 10:43

这个问题研究了n次,每次都以失败告终,今天又突然想研究下,但是还是没有进展。大家帮忙看下。先谢过了!

我描述下问题,我手头有个网站,用PHP+mysql+iis+windows 2003 配置,网站间歇性变慢,大概持续15分钟,每天1-2次。网站变慢后,网站打开速度从5s提高的20s,慢的速度难以让人接受。

在网站变慢的时候,我查看了下服务器cpu使用,不到10%。然后使用mysql命令

show processlist;

 

打印出结果如下:

mysql> show processlist;
+----------+------+-----------------+------+---------+------+--------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----------+------+-----------------+------+---------+------+--------------------+------------------+
| 19021447 | root | 127.0.0.1:28253 | o2o | Query | 17 | removing tmp table | DESC fanwe_user |
| 19025616 | root | 127.0.0.1:32578 | NULL | Query | 0 | NULL | show processlist |
+----------+------+-----------------+------+---------+------+--------------------+------------------+

 

持续打印 show processlist;命令 state还会变成close table等状态  Time时间有时候会增加到20s。

sql语句 DESC fanwe_user 我在phpmyadmin里执行 执行时间几乎统计不到,为什么在这里要花费 20s的查询时间呢

我去查询了下 mysql 慢查询日志:

输出结果 如下:

# Time: 140611 10:14:16
# User@Host: root[root] @ [127.0.0.1]
# Query_time: 6.218750 Lock_time: 0.000000 Rows_sent: 67 Rows_examined: 67
SET timestamp=1402452856;
DESC fanwe_user;
# Time: 140611 10:14:30
# User@Host: root[root] @ [127.0.0.1]
# Query_time: 7.718750 Lock_time: 0.015625 Rows_sent: 67 Rows_examined: 67
SET timestamp=1402452870;
DESC fanwe_user;
# Time: 140611 10:14:40
# User@Host: root[root] @ [127.0.0.1]
# Query_time: 7.531250 Lock_time: 0.000000 Rows_sent: 67 Rows_examined: 67
SET timestamp=1402452880;
DESC fanwe_user;
# Time: 140611 10:15:12
# User@Host: root[root] @ [127.0.0.1]
# Query_time: 23.765625 Lock_time: 0.000000 Rows_sent: 67 Rows_examined: 67
SET timestamp=1402452912;
DESC fanwe_user;
# Time: 140611 10:15:28
# User@Host: root[root] @ [127.0.0.1]
# Query_time: 10.296875 Lock_time: 0.000000 Rows_sent: 67 Rows_examined: 67
SET timestamp=1402452928;
DESC fanwe_user;
# Time: 140611 10:15:53
# User@Host: root[root] @ [127.0.0.1]
# Query_time: 10.812500 Lock_time: 0.000000 Rows_sent: 67 Rows_examined: 67
SET timestamp=1402452953;
DESC fanwe_user;
。。。。。后面还有很多 都是在DESC table。有时候 table的名字会变化。但只是2个表



现在对于这个一点头绪没有,希望各位能帮忙解决下。

 

 

=========================2014-06-18 更新===================================


mysql> show global variables like '%table%';
+----------------------------------------+----------+
| Variable_name                          | Value    |
+----------------------------------------+----------+
| big_tables                             | OFF      |
| innodb_file_per_table                  | OFF      |
| innodb_table_locks                     | ON       |
| lower_case_table_names                 | 1        |
| max_heap_table_size                    | 16777216 |
| max_tmp_tables                         | 32       |
| old_alter_table                        | OFF      |
| performance_schema_max_table_handles   | 100000   |
| performance_schema_max_table_instances | 50000    |
| sql_big_tables                         | OFF      |
| table_definition_cache                 | 400      |
| table_open_cache                       | 1520     |
| tmp_table_size                         | 70254592 |
| updatable_views_with_limit             | YES      |
+----------------------------------------+----------+
14 rows in set (0.00 sec)
=========================show create table fanwe_user 数据==================================
mysql> show create table fanwe_user\G;
*************************** 1. row ***************************
       Table: fanwe_user
Create Table: CREATE TABLE `fanwe_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(255) NOT NULL,
  `user_pwd` varchar(255) NOT NULL,
  `create_time` int(11) NOT NULL,
  `update_time` int(11) NOT NULL,
  `login_ip` varchar(255) NOT NULL,
  `group_id` int(11) NOT NULL,
  `is_effect` tinyint(1) NOT NULL,
  `is_delete` tinyint(1) NOT NULL,
  `email` varchar(255) NOT NULL,
  `mobile` varchar(255) NOT NULL,
  `score` int(11) NOT NULL,
  `money` double(20,4) NOT NULL,
  `verify` varchar(255) NOT NULL,
  `code` varchar(255) NOT NULL COMMENT '鐧诲綍鐢ㄧ殑鏍囪瘑鐮?,
  `pid` int(11) NOT NULL,
  `login_time` int(11) NOT NULL,
  `referral_count` int(11) NOT NULL,
  `password_verify` varchar(255) NOT NULL,
  `integrate_id` int(11) NOT NULL,
  `sina_id` int(11) NOT NULL,
  `renren_id` int(11) NOT NULL,
  `kaixin_id` int(11) NOT NULL,
  `sohu_id` int(11) NOT NULL,
  `lottery_mobile` varchar(255) NOT NULL,
  `lottery_verify` varchar(255) NOT NULL,
  `verify_create_time` int(11) NOT NULL,
  `tencent_id` varchar(255) NOT NULL,
  `referer` varchar(255) NOT NULL,
  `login_pay_time` int(11) NOT NULL,
  `focus_count` int(11) NOT NULL COMMENT '鍏虫敞鍒汉鐨勬暟閲?,
  `focused_count` int(11) NOT NULL COMMENT '绮変笣鏁?,
  `province_id` int(11) NOT NULL,
  `city_id` int(11) NOT NULL,
  `sex` tinyint(1) NOT NULL DEFAULT '-1',
  `my_intro` varchar(255) NOT NULL,
  `is_merchant` tinyint(1) NOT NULL,
  `merchant_name` varchar(255) NOT NULL,
  `is_daren` tinyint(1) NOT NULL,
  `daren_title` varchar(255) NOT NULL,
  `step` tinyint(1) NOT NULL,
  `byear` int(4) NOT NULL,
  `bmonth` int(2) NOT NULL,
  `bday` int(2) NOT NULL,
  `locate_time` int(11) DEFAULT '0' COMMENT '鐢ㄦ埛鏈

另外,我还有个问题没有说,我的这个数据库选择的是innodb类型的,但是我的表都是MyISAM类型的,不知道这会不会影响性能

Gina_的主页 Gina_ | 初学一级 | 园豆:4
提问于:2014-06-11 17:04
< >
分享
最佳答案
0

说一种可能:硬盘某处有物理损伤,每到读取他的时候变慢,换个硬盘可判断是否这个问题。

收获园豆:50
LiuKaiFa | 小虾三级 |园豆:1491 | 2014-06-11 21:42

请问 我如何排查下 是不是硬盘有损伤啊,有没有软件,因为我们的服务器是托管的,如果这个方案实施的话,我们需要关闭网站,如果不是这个问题 那么造成的损伤挺大

Gina_ | 园豆:4 (初学一级) | 2014-06-18 18:52

@Gina_: 你的服务器没有沉余备份?如果是这样的话,赶紧补救,风险太大。

LiuKaiFa | 园豆:1491 (小虾三级) | 2014-06-21 07:24
其他回答(11)
0

你可以看看是不是设置了不合适的索引

收获园豆:10
飞来飞去 | 园豆:2057 (老鸟四级) | 2014-06-11 17:16

user 表上没有索引

支持(0) 反对(0) Gina_ | 园豆:4 (初学一级) | 2014-06-11 18:21
0

帮不上忙……等着散分~~

wdwwtzy | 园豆:114 (初学一级) | 2014-06-11 19:00
0

内存占用情况查看没

收获园豆:10
小杰鱼 | 园豆:212 (菜鸟二级) | 2014-06-11 19:19
0

removing tmp table 应该是和查询语句中的临时表有关, 最好定位到相关的查询语句再贴出来让大家分析一下~

我也没遇到过这种情况, 也有可能是mysql以外的其他原因造成的~

收获园豆:30
小伍2013 | 园豆:1291 (小虾三级) | 2014-06-11 21:01

弱弱的问一句, 什么情况下  sql语句会出现临时表查询,除了子查询会用到临时表,其他的什么情况下 会有子查询

支持(0) 反对(0) Gina_ | 园豆:4 (初学一级) | 2014-06-14 00:29
0

DESC fanwe_user; 是你代码里执行的语句,还是mysql自己执行的。对了,这句语句是干嘛用的,从来没接触过。

angelshelter | 园豆:9914 (大侠五级) | 2014-06-12 09:27

DESC fanwe_user;  不是我程序里的语句,

DESC table 语句 是查看表描述的命令

支持(0) 反对(0) Gina_ | 园豆:4 (初学一级) | 2014-06-14 00:23
0

你这个是不是连接建立的太多了?

收获园豆:10
刘宏玺 | 园豆:14020 (专家六级) | 2014-06-12 09:33
0

我觉得应该先定位到底是哪个环节导致慢。

收获园豆:10
幻天芒 | 园豆:37207 (高人七级) | 2014-06-12 09:39

 我也是这样想的,但是主要是定位不到那个语句造成的,慢查询里面都是 一串DESC table 语句,而且这个语句我程序里没有的

支持(0) 反对(0) Gina_ | 园豆:4 (初学一级) | 2014-06-14 00:25

@Gina_: 对mysql了解不深,不懂了~

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2014-06-14 11:14
0

有可能查询表结构比较浪费性能,把 desc fanwe_user 的结果缓存一下试试

还可以在php代码中为每个sql查询记录日志,帮助分析

收获园豆:20
路人.乙 | 园豆:227 (菜鸟二级) | 2014-06-12 12:47

你说的2点

1:把 desc fanwe_user 的结果缓存一下试试  怎么清理?

2:系统挺大的,如果给每个语句写sql查询日志 是不是特别费时,另外 我还真没写过,请教!

支持(0) 反对(0) Gina_ | 园豆:4 (初学一级) | 2014-06-14 00:26
0

有没有可能是事务性的操作,造成表被锁,必须等待事务完成才行

检查一下网站所有事务试试

 

收获园豆:20
24年目标30万 | 园豆:166 (初学一级) | 2014-06-12 17:07
0

Innodb buffer 改大点,性能提升不是一点点。

innodb_buffer_pool_size=2G(原innodb_buffer_pool_size=99MB);
innodb_flush_log_at_trx_commit=0(原innodb_flush_log_at_trx_commit=1)

收获园豆:30
zzhi.wang | 园豆:5 (初学一级) | 2014-06-12 17:39

 你说的这一点提醒了我。

我发现一个问题,我数据库引起是innodb,表的引擎都是MyISAM。我是用phpmyadmin创建的数据库,默认数据引擎是innodb

支持(0) 反对(0) Gina_ | 园豆:4 (初学一级) | 2014-06-14 00:28
0

程序的问题,跟踪调试一下,某个方法或过程有死循环导致的

收获园豆:10
小xuo僧 | 园豆:214 (菜鸟二级) | 2014-06-14 23:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册