前言
MySql开启慢查询日志的功能,能够记录下响应时间超过设置阈值的SQL语句(包括SELECT、INSERT、DELETE、UPDATE、CALL等DML操作),以便于我们定位执行慢的SQL语句。
一、开启慢查询功能
1、临时开启:
可以使用命令查询是否开启此功能 :
mysql> show variables where variable_name like '%query_time%' or variable_name like '%query_log%';
+------------------------------+------------------------------+
| Variable_name | Value |
+------------------------------+------------------------------+
| binlog_rows_query_log_events | OFF |
| long_query_time | 10.000000 |
| slow_query_log | OFF |
| slow_query_log_file | /data/mysql/server1-slow.log |
+------------------------------+------------------------------+
4 rows in set (0.01 sec)
slow_query_log:慢查询已关闭
slow_query_log_file:慢查询日志保存的文件路径
long_query_time:SQL语句响应超过10秒记录到慢查询日志中
相关操作
# 开启慢查询
mysql> set global slow_query_log = on;
# 设置响应时间
mysql> set long_query_time = 8;
# 设置慢查询日志保存方式
## file:保存在文件
## table:保存在mysql库下的slow_log表中
mysql> set global log_output = file;
# 重启mysql服务
systemctl restart mysqld
2、永久开启:
直接修改mysql配置文件 /etc/my.cnf ,添加以下:
slow_query_log=ON
slow_query_log_file=/data/mysql/server1-slow.log
long_query_time=10
二、分析慢查询日志
1、直接打开查看
2、使用mysqldumpslow查看:
PS:mysqldumpslow可以根据参数格式化的显示日志
#显示慢查询日志中最慢的10条sql
root# mysqldumpslow -t 10 /data/mysql/zabbix-server1-slow.log
Reading mysql slow query log from zabbix-server1-slow.log
Count: 1 Time=12.00s (12s) Lock=0.00s (0s) Rows=1.0 (1), root[root]@localhost
select sleep(N)
Died at /usr/bin/mysqldumpslow line 161, <> chunk 1.
三、优化SQL语句
1、使用explain查询sql的执行情况
mysql> mysql> explain select User,Host from user;
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| 1 | SIMPLE | user | NULL | index | NULL | PRIMARY | 276 | NULL | 7 | 100.00 | Using index |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
参数分析:
id: 代表查询标识符。
select_type: 代表查询类型。
table:表示属于哪张数据表。
type:最重要的参数,表示连接使用的类型。从最好到最差的连接类型为const,eq_reg,ref,range,index和ALL。
possible_keys:显示可能应用在这张表中的索引。如果为null,则表示没有可能的索引。
key:实际使用的索引。如果为null,则表示没有使用索引。
key_len:使用的索引的长度,在不损失精确性的情况下,长度越短越好。
ref:表示索引的哪一列被使用了,如果可能的话,是一个常数。
rows:Mysql认为必须检查的用来返回请求数据的行数。
filtered:表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例。
extra:查询计划器给出额外的信息说明。
未完待续。。。