MySQL慢日志实践小结

慢日志查询作用

慢日志查询的主要功能就是,记录sql语句中超过设定的时间阈值的查询语句。例如,一条查询sql语句,我们设置的阈值为1s,当这条查询语句的执行时间超过了1s,则将被写入到慢查询配置的日志中.

慢查询主要是为了我们做sql语句的优化功能.

慢查询配置项说明

登录mysql服务,使用如下命令

mysql> show variables like '%query%';
+------------------------------+-----------------------------------------+
| Variable_name        | Value                  |
+------------------------------+-----------------------------------------+
| binlog_rows_query_log_events | OFF                   |
| ft_query_expansion_limit   | 20                   |
| have_query_cache       | YES                   |
| long_query_time       | 10.000000                |
| query_alloc_block_size    | 8192                  |
| query_cache_limit      | 1048576                 |
| query_cache_min_res_unit   | 4096                  |
| query_cache_size       | 33554432                |
| query_cache_type       | OFF                   |
| query_cache_wlock_invalidate | OFF                   |
| query_prealloc_size     | 8192                  |
| slow_query_log        | OFF                   |
| slow_query_log_file     | /usr/local/mysql/var/localhost-slow.log |
+------------------------------+-----------------------------------------+
13 rows in set (0.01 sec)

这里,我们只需要关注三个配置项即可。

1.slow_query_log

该配置项是决定是否开启慢日志查询功能,配置的值有ON或者OFF.

2.slow_query_log_file

该配置项是慢日志查询的记录文件,需要手动创建.

3.long_query_time

该配置项是设置慢日志查询的时间阈值,当超过这个阈值时,慢日志才会被记录.配置的值有0(任何的sql语句都记录下来),或者>0(具体的阈值).该配置项是以秒为单位的,并且可以设置为小数.

4.log-queries-not-using-indexes

该配置项是为了记录未使用到索引的sql语句.

如何配置慢查询

配置慢查询功能的方式有两种,一种是使用mysql的配置文件配置,另外一种是使用mysql命令配置.这里建议使用配置文件配置,因为在命令配置的过程中发现有时候配置项在set命令的时候是成功了,但是查询还是没设置。

1.配置文件配置

// 找到[mysqld],在其下面添加如下代码即可.
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/var/localhost-slow.log
long_query_time=0
log-queries-not-using-indexes = 1
// 配置好后,重启mysql服务

2.使用命令配置

// 这里就简单些一个配置项就行了,其他的配置项均按照此方法配置
mysql> set slow_query_log=ON;

配置好之后,查看mysql慢查询日志是否配置成功.

mysql> show variables like '%query%';
+------------------------------+-----------------------------------------+
| Variable_name        | Value                  |
+------------------------------+-----------------------------------------+
| binlog_rows_query_log_events | OFF                   |
| ft_query_expansion_limit   | 20                   |
| have_query_cache       | YES                   |
| long_query_time       | 0.000000                |
| query_alloc_block_size    | 8192                  |
| query_cache_limit      | 1048576                 |
| query_cache_min_res_unit   | 4096                  |
| query_cache_size       | 33554432                |
| query_cache_type       | OFF                   |
| query_cache_wlock_invalidate | OFF                   |
| query_prealloc_size     | 8192                  |
| slow_query_log        | ON                   |
| slow_query_log_file     | /usr/local/mysql/var/localhost-slow.log |
+------------------------------+-----------------------------------------+
13 rows in set (0.01 sec)

如何查看慢日志记录

在配置慢查询之前,我们已经导入了示例的数据文件,这里就不做单独的演示了。mysql官方数据库示例 。接下来,我们就开始做查询操作.

mysql> select * from city where city='Salala';
+---------+--------+------------+---------------------+
| city_id | city  | country_id | last_update     |
+---------+--------+------------+---------------------+
|   444 | Salala |     71 | 2006-02-15 04:45:25 |
+---------+--------+------------+---------------------+
1 row in set (0.01 sec)

此时,我们根据配置的慢查询日志记录文件/usr/local/mysql/var/localhost-slow.log,发现该文件记录了上面的命令操作.

# Time: 2019-01-17T08:12:27.184998Z
# User@Host: root[root] @ localhost [] Id:   4
# Query_time: 0.002773 Lock_time: 0.001208 Rows_sent: 1 Rows_examined: 600
SET timestamp=1547712747;
select * from city where city='Salala';

上诉文件配置内容说明

1.Time

该日志记录的时间

2.User@Host

MySQL登录的用户和登录的主机地址

3.Query_time一行

第一个时间是查询的时间、第二个是锁表的时间、第三个是返回的行数、第四个是扫描的行数

4.SET timestamp

这一个是MySQL查询的时间

5.sql语句

这一行就很明显了,表示的是我们执行的sql语句

总结

由于我们配置long_query_time=0,因此所有的sql语句都将被记录下来,这里我们假设,仅仅是假设。我们设置的long_query_time=5,然而上面的第三项中Query_time大于5,如果是实际项目中不属于正常范围,则需要对其进行优化,当然优化的方式有很多种,下面我们使用简单的索引方式进行优化一下。

优化sql语句

1.先查看原本的sql语句执行结构

mysql> explain select * from city where city='Salala'\G;
*************************** 1. row ***************************
      id: 1
 select_type: SIMPLE
    table: city
  partitions: NULL
     type: ALL
possible_keys: NULL
     key: NULL
   key_len: NULL
     ref: NULL
     rows: 600
   filtered: 10.00
    Extra: Using where
1 row in set, 1 warning (0.00 sec)
mysql> create index idx_cityName on city(`city`);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0

看得出,该sql语句是进行了全盘扫描。我们则用索引对其简单的优化一下。

2.创建索引

mysql> create index idx_cityName on city(`city`);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0

3.在用explain分析一次

mysql> explain select * from city where city='Salala'\G;
*************************** 1. row ***************************
      id: 1
 select_type: SIMPLE
    table: city
  partitions: NULL
     type: ref
possible_keys: idx_cityName
     key: idx_cityName
   key_len: 152
     ref: const
     rows: 1
   filtered: 100.00
    Extra: NULL
1 row in set, 1 warning (0.00 sec)

通过创建索引,我们发现此时只扫描了一行,并且是使用的索引扫描,因此大大提高了一个mysql查询的效率。

MySQL慢查询使用总结

在平常的开发中,慢查询作为MySQL优化的一个途径,是非常有用的。它会记录下我们一些查询时间长的sql语句,对其语句我们进行分析,从而达到sql查询语句的最优化。但是慢日志查询开启之后,针对sql查询会通过磁盘I/O将相关的记录写入到磁盘文件中,增加了一个磁盘的I/O读写。因此,我们该功能用在开发、测试环境上,而不用在生产环境中去。

慢日志查询工具

由于慢日志查询文件越到后期,内容越多。我们对其分析的压力越大,因此我们需要借助某些工具实现快速分析。这些工具还没完全使用熟悉,后期单独写一篇文章介绍该类型的工具,这里只是罗列一下工具名称。
1.mysqldumpslow
2.pt-query-digest
3.mysqltop(天兔Lepus)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • MySQL中按时间获取慢日志信息的方法

    今天处理一个case: 数据库异常,连接数突增. 想着分析一下慢日志,可是一看慢日志都好几G了,而且是短日志格式,找到那个时间点相对比较难.于是写了一个脚本从慢日志按时间提取点日志.脚本: https://github.com/wubx/mysql-binlog-statistic/blob/master/bin/cutlogbytime 使用方法: 复制代码 代码如下: cutlogbytime #用于从慢日志用截取一个时间段的日志方便分析 ./cutlogbytime /path/slowl

  • mysql 5.5 开启慢日志slow log的方法(log_slow_queries)

    1.MySQL 5.5命令行里面 复制代码 代码如下: set global log_slow_queries = on;                               # 开启慢日志 set [session|global]  long_query_time =0.2               # 设置时间.精确的毫秒 set global  log_queries_not_using_indexes = on;   # 设置无索引的查询 2.查看存放日志的形式 mysql>

  • MySQL的慢日志线上问题及优化方案

    MySQL 慢日志(slow log)是 MySQL DBA 及其他开发.运维人员需经常关注的一类信息.使用慢日志可找出执行时间较长或未走索引等 SQL 语句,为进行系统调优提供依据. 本文将结合一个线上案例,分析如何正确设置 MySQL 慢日志参数和使用慢日志功能,并介绍下网易云 RDS 对 MySQL 慢日志功能的增强. MySQL 参数组功能 网易云 RDS 实例提供了参数组管理功能,可通过参数管理界面查看绝大部分常用的 MySQL 系统参数,用户可了解当前运行值和建议值: 用户还可通过参

  • 根据mysql慢日志监控SQL语句执行效率

    根据mysql慢日志监控SQL语句执行效率 启用MySQL的log-slow-queries(慢查询记录). 在Linux环境下先要找到my.cnf文件(一般在/etc/mysql/),然后可能会发现该文件修改后无法保存,原因是你没有相应的权限,可以从属性中看到该文件的所有者是root,这时要先以root的身份打开它: sudo nautilus /etc/mysql 接着再打开my.cnf文件然后找到[mysqld]标签在下面加上: log-slow-queries=/path/slow.lo

  • MySQL慢日志实践小结

    慢日志查询作用 慢日志查询的主要功能就是,记录sql语句中超过设定的时间阈值的查询语句.例如,一条查询sql语句,我们设置的阈值为1s,当这条查询语句的执行时间超过了1s,则将被写入到慢查询配置的日志中. 慢查询主要是为了我们做sql语句的优化功能. 慢查询配置项说明 登录mysql服务,使用如下命令 mysql> show variables like '%query%'; +------------------------------+----------------------------

  • MySQL优化教程之慢查询日志实践

    一.慢查询日志概念 对于SQL和索引的优化问题,我们会使用explain去分析SQL语句.但是真正的企业级项目有成千上万条SQL,我们不可能从头开始一条一条explain去分析.我们从什么地方可以获取那些运行时间长,耗性能的SQL?? 我们可以打开慢查询日志: 根据具体的业务和并发量来预估一个时间上限(20ms.100ms),设置好后开启业务,压测后打开慢查询日志,就会看到超过执行时间的SQL,然后使用explain分析这些耗时的SQL语句 步骤如下: 打开慢查询日志开关slow_query_l

  • MySQL事务日志(redo log和undo log)的详细分析

    目录 前言 1.redo log 1.1 redo log和二进制日志的区别 1.2 redo log的基本概念 1.3 日志块(log block) 1.4 log group和redo log file 1.5 redo log的格式 1.6 日志刷盘的规则 1.7 数据页刷盘的规则及checkpoint 1.8 LSN超详细分析 1.9 innodb的恢复行为 1.10 和redo log有关的几个变量 2.undo log 2.1 基本概念 2.2 undo log的存储方式 2.3 和

  • MySQL 配置主从复制实践分享

    目录 一.检测通信 二.master配置 1. 开启二进制日志 2. 创建一个用于主从库通信用的账号 3. 获取binlog的日志文件名和position 三.slave配置 1. 配置全局唯一的server-id 2. 使用master创建的账户读取binlog同步数据 3. 开启slave服务 四.配置中可能出现的问题 1. 网络连接问题 2. binlog的position问题 3. SQL线程出错 一.检测通信 查看主库(master)和从库(slave)的ip地址,并检测是否可以通信

  • MySQL 数据库的监控方式小结

    目录 1.连接数(Connects) 2.缓存(bufferCache) 3.锁(lock) 4.慢SQL 5.statement 6.吞吐(Database throughputs) 7.数据库参数(serverconfig) 8.慢 SQL排查步骤 9.总结 对于当前数据库的监控方式有很多,分为数据库自带.商用.开源三大类,每一种都有各自的特色: 而对于 mysql 数据库由于其有很高的社区活跃度,监控方式更是多种多样,不管哪种监控方式最核心的就是监控数据,获取得到全面的监控数据后就是灵活的

  • MySQL的日志基础知识及基本操作学习教程

    MySQL日志主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志: 日志是mysql数据库的重要组成部分.日志文件中记录着mysql数据库运行期间发生的变化:也就是说用来记录mysql数据库的客户端连接状况.SQL语句的执行情况和错误信息等.当数据库遭到意外的损坏时,可以通过日志查看文件出错的原因,并且可以通过日志文件进行数据恢复. 错误日志 在mysql数据库中,错误日志功能是默认开启的.并且,错误日志无法被禁止.默认情况下,错误日志存储在mysql数据库的数据文件中.错误日志文件

  • MySql存储过程学习知识小结

    什么是存储过程: 存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了. 存储过程的好处: 1.由于数据库执行动作时,是先编译后执行的.然而存储过程是一个编译过的代码块,所以执行效率要比T-SQL语句高. 2.一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率. 3.通过存储过程能够使没有权限的

  • 简单整理MySQL的日志操作命令

    1.首先确认你日志是否启用了 MySQL>show variables like 'log_bin'; 如果启用了,即ON那日志文件就在MySQL的安装目录的data目录下 2.怎样知道当前的日志 MySQL> show master status; 3.看二进制日志文件用MySQLbinlog shell>MySQLbinlog mail-bin.000001 或者 shell>MySQLbinlog mail-bin.000001 | tail 4.正确删除MySQL BIN-

  • mysql二进制日志文件恢复数据库

    二进制日志的文件的作用 mysql二进制日志文件用来记录所有用户对数据库操作,即记录用户对数据库操作的sql语句.如果有此文件,当数据库发生意外时,可以通过此文件查看到用户在此文件记录的时间段内用户所做的操作,再和数据库备份配合使用,即可再现用户操作,使数据库恢复. 二进制日志文件的弊端 二进制日志文件开启后,所有对数据库操作的记录均会被记录到此文件, 所以,当长时间开启之后,日志文件会变得很大,占用磁盘空间. 使用二进制日志文件恢复数据库 开启日志文件 mysql默认是不开启日志文件的功能的,

随机推荐