前提:分析mysql性能的时候会查看数据库的哪些sql语句有问题,效率低。这就用到了数据库的慢查询,作用就是: 它能记录下所有执行超过long_query_time时间的SQL语句,帮你找到执行慢的SQL,方便我们对这些SQL进行优化。
1.配置慢查询
在mysql客户端执行
mysql> show variables like "%query%" ;
得到结果:
设置慢查询.png
涉及参数解释:
slow_query_log :是否开启慢查询,ON 开启,OFF关闭
修改参数使用命令:
set global slow_query_log=ON; #开启MySQL慢查询功能
long_query_time :慢查询时间设置,默认是10秒
slow_query_log_file :慢查询日志存放路径
还可以通过修改MySQL配置文件参数,开启MySQL慢查询。vi /etc/my.cnf ,在[mysqld]段添加以下代码:
slow-query-log = on #开启MySQL慢查询功能
slow_query_log_file = /data/mysql/127-slow.log #设置MySQL慢查询日志路径
long_query_time = 5 #修改为记录5秒内的查询,默认不设置此参数为记录10秒内的查询
log-queries-not-using-indexes = on #记录未使用索引的查询
:wq! #保存退出
service mysqld restart #重启MySQL服务
2.查看慢查询日志
执行sql后就可以看到配置的路径下面有日志生成了,对于得到的日志有2中方式可以对其分析,一是mysql自带的 mysqldumpslow,另外一个是要独自安装的 mysqlsla,下面分别介绍一下。
2.1 mysqldumpslow 分析慢查询日志
执行命令:
[root@chances126 /]# mysqldumpslow /var/lib/mysql/mysql-slow.log
得到的信息解释:
主要功能是, 统计不同慢sql的
出现次数(Count),
执行最长时间(Time),
累计总耗费时间(Time),
等待锁的时间(Lock),
发送给客户端的行总数(Rows),
扫描的行总数(Rows),
用户以及sql语句本身(抽象了一下格式, 比如 limit 1, 20 用 limit N,N 表示).
对我而言,看到返回的这一对信息,我是崩溃的,也没有提示是哪个数据库报的,一般一台服务器有很多数据库,这样根本看不出来啊。我不偏爱这个工具,虽然他是不用安装的。
2.2 mysqlsla 分析慢查询日志
这个工具需要安装,看下如何安装吧。Linux如何安装 mysqlsla
安装好后,接下来就是使用了:
#查询记录最多的10条,可以指定具体的数据库
mysqlsla -lt slow -sort t_sum -sf "+select,update,INSERT" -db hunaniptv -top 10 /var/lib/mysql/mysqld_slow.log
#查询记录最多的20个sql语句,并写到select.log中去
mysqlsla -lt slow --sort t_sum --top 20 /data/mysql/127-slow.log >/tmp/select.log
#统计慢查询文件为/data/mysql/127-slow.log的所有select的慢查询sql,并显示执行时间最长的100条sql,并写到sql_select.log中去
mysqlsla -lt slow -sf "+select" -top 100 /data/mysql/127-slow.log >/tmp/sql_select.log
#统计慢查询文件为/data/mysql/127-slow.log的数据库为mydata的所有select和update的慢查询sql,并查询次数最多的100条sql,并写到sql_num.sql中去
mysqlsla -lt slow -sf "+select,update" -top 100 -sort c_sum -db mydata /data/mysql/127-slow.log >/tmp/sql_num.log
得到的信息大概是这种样子:
mysqlsla分析慢查询.png
返回参数解释:
Count, sql的执行次数及占总的slow log数量的百分比.
Time, 执行时间, 包括总时间, 平均时间, 最小, 最大时间, 时间占到总慢sql时间的百分比.
95% of Time, 去除最快和最慢的sql, 覆盖率占95%的sql的执行时间.
Lock Time, 等待锁的时间.95% of Lock , 95%的慢sql等待锁时间.Rows sent, 结果行统计数量, 包括平均, 最小, 最大数量.
Rows examined, 扫描的行数量.
Database, 属于哪个[数据库]
Users, 哪个用户,IP, 占到所有用户执行的sql百分比
Query abstract, 抽象后的sql语句
Query sample, sql语句
对于得到这个信息还可以进一步分析,就是登陆到mysql 的客户端,登陆数据库,执行 EXPLAIN查看sql具体的 type 信息。
[root@chances126 /]# mysql -uroot -pchances
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 141058
Server version: 5.1.73-log Source distribution
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use sc_epg_release4
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> EXPLAIN select distinct a.* from EPG_CONTENT_SERIES a join EPG_CATEGORY_ITEM b on a.CONTENT_CODE = b.ITEM_CODE where a.ENABLE_STATUS=1 and b.STATUS=0 and a.EXTERNAL_CODE = '2000000200000010042000000006088';
+----+-------------+-------+------+---------------+-------------+---------+-----------------------------+-------+------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+-------------+---------+-----------------------------+-------+------------------------------+
| 1 | SIMPLE | b | ALL | NULL | NULL | NULL | NULL | 28504 | Using where; Using temporary |
| 1 | SIMPLE | a | ref | seriesIndex | seriesIndex | 387 | sc_epg_release4.b.ITEM_CODE | 1 | Using where |
+----+-------------+-------+------+---------------+-------------+---------+-----------------------------+-------+------------------------------+
2 rows in set (0.00 sec)
mysql>
可以看出 a 表是全表查询,b表级别是 ref ,可以进一步分析 sql 了。
性能从最好到最差:system、const、eq_reg、ref、range、index和ALL
如果看到性能不好,就可以把sql给研发去分析了。