详解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       | NO                        |
| long_query_time       | 10.000000                    |
| query_alloc_block_size    | 8192                       |
| query_prealloc_size     | 8192                       |
| slow_query_log        | OFF                       |
| slow_query_log_file     | /usr/local/mysql/data/seandeMacBook-Pro-slow.log |
+------------------------------+--------------------------------------------------+
8 rows in set (0.00 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;
-- 如果执行失败,可能是由于没有添加global

mysql> set global 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       | NO                        |
| long_query_time       | 10.000000                    |
| query_alloc_block_size    | 8192                       |
| query_prealloc_size     | 8192                       |
| slow_query_log        | ON                        |
| slow_query_log_file     | /usr/local/mysql/data/seandeMacBook-Pro-slow.log |
+------------------------------+--------------------------------------------------+
8 rows in set (0.01 sec)

如何查看慢查询记录

首先,先将慢查询日志的时间阈值设置为0

mysql> set global long_query_time=0;
Query OK, 0 rows affected (0.00 sec)

重启mysql后生效

在配置慢查询之前,已经导入了示例的数据文件。mysql官方数据示例,接下来就开使查询。

mysql> select * from city where Name = 'Salala';
+------+--------+-------------+----------+------------+
| ID  | Name  | CountryCode | District | Population |
+------+--------+-------------+----------+------------+
| 2818 | Salala | OMN     | Zufar  |   131813 |
+------+--------+-------------+----------+------------+
1 row in set (0.01 sec)

根据配置的慢查询日志记录文件/usr/local/mysql/data/seandeMacBook-Pro-slow.log ,查看以上的命令操作。

# Time: 2019-08-20T09:17:49.791767Z
# User@Host: root[root] @ localhost [] Id:  150
# Query_time: 0.002549 Lock_time: 0.000144 Rows_sent: 1 Rows_examined: 4079
SET timestamp=1566292669;
select * from city where Name = '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 Name='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: 4188
   filtered: 10.00
    Extra: Using where
1 row in set, 1 warning (0.00 sec)

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

2、创建索引

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

3、使用explain分析一波

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

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

mysql慢查询使用总结

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

慢日志查询工具

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

1.mysqldumpslow
2.pt-query-digest
3.mysqltop(天兔Lepus)

以上就是详解mysql慢日志查询的详细内容,更多关于mysql慢日志查询的资料请关注我们其它相关文章!

(0)

相关推荐

  • MySQL数据库高级查询和多表查询

    MySQL多表查询 添加练习表 -- 用户表(user) CREATE TABLE `user`( `id` INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户id(主键)', `username` VARCHAR(50) COMMENT '用户姓名', `age` CHAR(3) COMMENT '用户年龄' ); -- 订单表(orders) CREATE TABLE `orders`( `id` INT AUTO_INCREMENT PRIMARY KEY

  • mysql如何查询日期与时间

    前言: 在项目开发中,一些业务表字段经常使用日期和时间类型,而且后续还会牵涉到这类字段的查询.关于日期及时间的查询等各类需求也很多,本篇文章简单讲讲日期及时间字段的规范化查询方法. 1.日期和时间类型概览 MySQL支持的日期和时间类型有 DATETIME.TIMESTAMP.DATE.TIME.YEAR ,几种类型比较如下: 涉及到日期和时间字段类型选择时,根据存储需求选择合适的类型即可. 2.日期和时间相关函数 处理日期和时间字段的函数有很多,有的经常会在查询中使用到,下面介绍下几个相关函数

  • 深入讲解MongoDB的慢日志查询(profile)

    前言 说到MongoDB的慢日志分析,就不得不提到profile分析器,profile分析器将记录的慢日志写到system.profile集合下,这个集合是一个固定集合.我们可以通过对这个集合的查询,来了解当前的慢日志,进而对数据库进行优化. 整体环境 MongoDB 3.2.5 实战 Part1:输出示范 在查询system.profile的时候,我们能够观察到所有的操作,包括remove,update,find等等都会被记录到system.profile集合中,该集合中包含了诸多信息,如:

  • 实例详解mysql子查询

    子查询分类 按返回结果集分类 子查询按返回结果集的不同分为4种:表子查询,行子查询,列子查询和标量子查询. 表子查询:返回的结果集是一个行的集合,N行N列(N>=1).表子查询经常用于父查询的FROM子句中. 行子查询:返回的结果集是一个列的集合,一行N列(N>=1).行子查询可以用于福查询的FROM子句和WHERE子句中. 列子查询:返回的结果集是一个行的集合,N行一列(N>=1). 标量子查询:返回的结果集是一个标量集合,一行一列,也就是一个标量值.可以指定一个标量表达式的任何地方,

  • MySQL之select in 子查询优化的实现

    下面的演示基于MySQL5.7.27版本 一.关于MySQL子查询的优化策略介绍: 子查询优化策略 对于不同类型的子查询,优化器会选择不同的策略. 1. 对于 IN.=ANY 子查询,优化器有如下策略选择: semijoin Materialization exists 2. 对于 NOT IN.<>ALL 子查询,优化器有如下策略选择: Materialization exists 3. 对于 derived 派生表,优化器有如下策略选择: derived_merge,将派生表合并到外部查询

  • MySQL单表查询实例详解

    1.准备数据 以下操作将在该表中进行 create table student ( id int unsigned primary key auto_increment, name char(12) not null, gender enum("male","famale") default "male", age tinyint unsigned not null, hoc_group char(12) not null, html tinyi

  • MySQL如何优化查询速度

    前面章节我们介绍了如何选择优化的数据类型.如何高效的使用索引,这些对于高性能的MySQL来说是必不可少的. 但这些还完全不够,还需要合理的设计查询. 如果查询写的很糟糕,即使表结构再合理.索引再合适,也是无法实现高性能的. 谈到MySQL性能优化,查询优化作为优化的源头,它也是最能体现一个系统是否更快. 本章以及接下来的几章将会着重讲解关于查询性能优化的内容,从中会介绍一些查询优化的技巧,帮助大家更深刻地理解MySQL如何真正地执行查询.究竟慢在哪里.如何让其快起来,并明白高效和低效的原因何在,

  • MySQL百万级数据量分页查询方法及其优化建议

    数据库SQL优化是老生常谈的问题,在面对百万级数据量的分页查询,又有什么好的优化建议呢?下面将列举了一些常用的方法,供大家参考学习! 方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N 适应场景: 适用于数据量较少的情况(元组百/千级) 原因/缺点: 全表扫描,速度会很慢 且 有的数据库结果集返回不稳定(如某次返回1,2,3,另外的一次返回2,1,3). Limit限制的是从结果集的M位置处取出N条输出,其余

  • MySQL 参数相关概念及查询更改方法

    前言: 在前面一些文章中,经常能看到介绍某某参数的作用,可能有些小伙伴仍搞不清楚 MySQL 参数是啥.本篇文章我们来聊聊 MySQL 参数,学习下如何管理维护 MySQL 参数. 1.MySQL参数概念 我们所说的参数在官方文档中称为 系统变量 (system variable),不同的变量有着不同的作用. MySQL 服务端维护了许多表示其配置的系统变量,所有变量均有默认值.一般可以在启动命令行中或配置文件中对它们进行设置. 系统变量分为全局系统变量(global)和会话系统变量(sessi

  • 详解mysql慢日志查询

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

  • 详解MySQL的sql_mode查询与设置

    1,执行SQL查看 select @@session.sql_mode; 全局级别: 查看 select @@global.sql_mode; 2,修改 set @@session.sql_mode='xx_mode' set session sql_mode='xx_mode' 全局级别:修改 set global sql_mode='xx_mode'; set @@global.sql_mode='xx_mode'; session均可省略,默认session,仅对当前会话有效 全局修改的话

  • 详解MySQL like如何查询包含'%'的字段(ESCAPE用法)

    在SQl like语句中,比如 SELECT * FROM user WHERE username LIKE '%luchi%' SELECT * FROM user WHERE username LIKE '_luchi_', % 作为通配符通配多个 _ 作为通配符通配一个 但当like 所要查询的字段中含有 % ,我们如何去查: 这个时候就需要指明 字段中的那个'%' 不作为通配符: 这里就需要用到 ESCAPE 转义 测试: 这里我们使用这张表 转义前: SELECT * FROM use

  • 一文详解MySQL Binlog日志与主从复制

    目录 1. Binlog日志的介绍 2. 主从复制 2.1 主从复制的流程 2.2 GTID 2.3 复制模型 2.4 MGR模式 2.5 并行回放 1. Binlog日志的介绍 Binlog是Binary log的缩写,即二进制日志.Binlog主要有三个作用:持久化时将随机IO转化为顺序IO,主从复制以及数据恢复.本文重点主从复制相关的问题. Binlog日志由一个索引文件与很多日志文件组成,每个日志文件由魔数以及事件组成,每个日志文件都会以一个Rotate类型的事件结束. 对于每个事件,都

  • 详解mysql跨库查询解决方案

    1.第一种跨库查询,是在同一个mysql服务器下两个不同的数据库之间的联查,关系如下图 在同一个mysql服务器下,不同的两个数据直接加上库名就可以实现跨库查询了 select * from t_test1 t1, test2.t_test2 t2 where t1.id = t2.id 执行sql查询到一下结果 2.第二种跨库查询,是在两台不同服务器(物理服务器)上分别安装的mysql服务器,实现跨库查询,其实现原理类似一个虚拟映射,需要用到mysql的另一个存储引擎Federated,FED

  • 详解MySql的慢查询分析及开启慢查询日志

    我最近也在研究MySQL性能优化的路上,那么今天也算个学习笔记吧! 在小伙伴们开发的项目中,对于MySQL排查问题找出性能瓶颈来说,最容易发现并解决的问题就是MYSQL的慢查询以及没有得用索引的查询. 接下来教大家如何开启MySQL5.0版本以上的慢查询日志记录: OK,一起开始找出mysql中执行起来不"爽"的SQL语句吧. 首先,我们通过mysql命令进入mysql命令行中: [root@yunuo_vm ~]# mysql -u root -p Enter password: W

  • 详解MySQL插入和查询数据的相关命令及语句使用

    插入数据 MySQL 表中使用 INSERT INTO SQL语句来插入数据. 你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据. 语法 以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法: INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN ); 如果数据是字符型,必须使用单引号或者双引号,如:"value

  • 详解MySQL 重做日志(redo log)与回滚日志(undo logo)

    前言: 前面文章讲述了 MySQL 系统中常见的几种日志,其实还有事务相关日志 redo log 和 undo log 没有介绍.相对于其他几种日志而言, redo log 和 undo log 是更加神秘,难以观测的.本篇文章将主要介绍这两类事务日志的作用及运维方法. 1.重做日志(redo log) 我们都知道,事务的四大特性里面有一个是 持久性 ,具体来说就是只要事务提交成功,那么对数据库做的修改就被永久保存下来了,不可能因为任何原因再回到原来的状态.那么 MySQL 是如何保证一致性的呢

  • 详解MySQL 慢查询

    查询mysql的操作信息 show status -- 显示全部mysql操作信息 show status like "com_insert%"; -- 获得mysql的插入次数; show status like "com_delete%"; -- 获得mysql的删除次数; show status like "com_select%"; -- 获得mysql的查询次数; show status like "uptime";

  • 详解 Mysql 事务和Mysql 日志

    事务特性 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节. 2.一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 .比如A向B转账,不可能A扣了钱,B却没收到. 3.隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰.比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账. 4.持久性(Durability):事务完成后,事务对数据库的所有更新

随机推荐