mysql性能的检查和调优方法

来源:asp之家 时间:2009-05-17 09:21:00 

我一直是使用mysql这个数据库软件,它工作比较稳定,效率也很高。在遇到严重性能问题时,一般都有这么几种可能:

1、索引没有建好;

2、sql写法过于复杂;

3、配置错误;

4、机器实在负荷不了;

1、索引没有建好

如果看到mysql消耗的cpu很大,可以用mysql的client工具来检查。

在linux下执行

/usr/local/mysql/bin/mysql -hlocalhost -uroot -p

输入密码,如果没有密码,则不用-p参数就可以进到客户端界面中。

看看当前的运行情况

show full processlist

可以多运行几次

这个命令可以看到当前正在执行的sql语句,它会告知执行的sql、数据库名、执行的状态、来自的客户端ip、所使用的帐号、运行时间等信息

在我的cache后端,这里面大部分时间是看不到显示任何sql语句的,我认为这样才算比较正常。如果看到有很多sql语句,那么这台mysql就一定会有性能问题

如果出现了性能问题,则可以进行分析:

1、是不是有sql语句卡住了?

这是出现比较多的情况,如果数据库是采用myisam,那么有可能有一个写入的线程会把数据表给锁定了,如果这条语句不结束,则其它语句也无法运行。

查看processlist里的time这一项,看看有没有执行时间很长的语句,要留意这些语句。

2、大量相同的sql语句正在执行

如果出现这种情况,则有可能是该sql语句执行的效率低下,同样要留意这些语句。

然后把你所怀疑的语句统统集合一下,用desc(explain)来检查这些语句。

首先看看一个正常的desc输出:

mysql> desc select * from imgs where imgid=1651768337;

+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+

| 1 | SIMPLE | imgs | const | PRIMARY | PRIMARY | 8 | const | 1 | |

+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+

1 row in set (0.00 sec)

注意key、rows和Extra这三项,这条语句返回的结果说明了该sql会使用PRIMARY主键索引来查询,结果集数量为1条,Extra没有显示,证明没有用到排序或其他操作。由此结果可以推断,mysql会从索引中查询imgid=1651768337这条记录,然后再到真实表中取出所有字段,是很简单的操作。

key是指明当前sql会使用的索引,mysql执行一条简单语句时只能使用到一条索引,注意这个限制;rows是返回的结果集大小,结果集就是使用该索引进行一次搜索的所有匹配结果;Extra一般会显示查询和排序的方式,。

如果没有使用到key,或者rows很大而用到了filesort排序,一般都会影响到效率,例如:

mysql> desc select * from imgs where userid="7mini" order by clicks desc limit 10;

+----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+

| 1 | SIMPLE | imgs | ALL | NULL | NULL | NULL | NULL | 12506 | Using where; Using filesort |

+----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+

1 row in set (0.00 sec)

这条sql结果集会有12506条,用到了filesort,所以执行起来会非常消耗效率的。这时mysql执行时会把整个表扫描一遍,一条一条去找到匹配userid="7mini"的记录,然后还要对这些记录的clicks进行一次排序,效率可想而知。真实执行时如果发现还比较快的话,那是因为服务器内存还足够将12506条比较短小的记录全部读入内存,所以还比较快,但是并发多起来或者表大起来的话,效率问题就严重了。

这时我把userid加入索引:

create index userid on imgs (userid);

然后再检查:

mysql> desc select * from imgs where userid="7mini" order by clicks desc limit 10;

+----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+

| 1 | SIMPLE | imgs | ref | userid | userid | 51 | const | 8 | Using where; Using filesort |

+----+-------------+-------+------+---------------+--------+---------+-------+------+-----------------------------+

1 row in set (0.00 sec)

嗯,这时可以看到mysql使用了userid这个索引搜索了,用userid索引一次搜索后,结果集有8条。然后虽然使用了filesort一条一条排序,但是因为结果集只有区区8条,效率问题得以缓解。

标签:mysql,性能,检查,调优
0
投稿

猜你喜欢

  • ASP.NET MVC实现区域或城市选择

    2023-07-13 17:50:00
  • python批量生成条形码的示例

    2023-02-22 17:49:03
  • python3实现微型的web服务器

    2021-03-03 09:00:49
  • GoLang切片并发安全解决方案详解

    2024-05-09 09:54:15
  • pygame实现俄罗斯方块游戏

    2023-04-06 20:17:14
  • 2018年Python值得关注的开源库、工具和开发者(总结篇)

    2023-01-18 08:32:15
  • SQL恢复master数据库方法 只有mdf文件的数据库如何恢复

    2024-01-17 20:17:53
  • 三招解决SQL Server数据库权限冲突

    2009-03-16 16:58:00
  • 使用Pyhton集合set()实现成果查漏的例子

    2023-10-20 17:49:00
  • Ajax缓存和编码问题的最终解决方案

    2010-03-30 13:42:00
  • Python创建SQL数据库流程逐步讲解

    2024-01-23 14:29:17
  • MySQL 统计查询实现代码

    2024-01-25 06:41:14
  • python正则表达式之re.match()与re.search()的用法及区别

    2022-05-14 13:21:46
  • Python操作Mysql实例代码教程在线版(查询手册)

    2024-01-24 17:07:44
  • php析构函数的具体用法小结

    2024-04-23 09:20:31
  • python3.8+django2+celery5.2.7环境准备(python测试开发django)

    2022-08-19 06:17:14
  • 利用python爬取斗鱼app中照片方法实例

    2022-01-03 17:40:39
  • JetBrains(IEDA、CLion、Pycharm) 学生获得免费使用资格

    2022-02-21 09:25:35
  • python如何读写json数据

    2021-09-17 17:27:07
  • Python格式化输出字符串方法小结【%与format】

    2023-01-06 00:01:50
  • asp之家 网络编程 m.aspxhome.com