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

一、慢查询日志概念

对于SQL和索引的优化问题,我们会使用explain去分析SQL语句。但是真正的企业级项目有成千上万条SQL,我们不可能从头开始一条一条explain去分析。我们从什么地方可以获取那些运行时间长,耗性能的SQL??

我们可以打开慢查询日志

根据具体的业务和并发量来预估一个时间上限(20ms、100ms),设置好后开启业务,压测后打开慢查询日志,就会看到超过执行时间的SQL,然后使用explain分析这些耗时的SQL语句

步骤如下:

  • 打开慢查询日志开关slow_query_log
  • 设置合理的、业务可以接受的慢查询时间上限
  • 压测执行各种业务
  • 查看慢查询日志,找出所有执行耗时的SQL语句
  • 用explain分析这些耗时的SQL语句,从而针对性优化

MySQL可以设置慢查询日志,当SQL执行的时间超过我们设定的时间,那么这些SQL就会被记录在慢查询日志当中,然后我们通过查看日志,用explain分析这些SQL的执行计划,来判定为什么效率低下,是没有使用到索引?还是索引本身创建的有问题?或者是索引使用到了,但是由于表的数据量太大,花费的时间就是很长,那么此时我们可以把表分成多个小表等。

慢查询日志相关的参数如下所示:

(MySQL定义的很多的全局的开关,都是在全局变量中存储,可以用show/set variables查看或者设置全局变量的值)

慢查询日志开关默认是关闭的

慢查询日志的路径:默认在/var/lib/mysql/

慢查询日志记录了包含所有执行时间超过参数 long_query_time(单位:秒)所设置值的 SQL语句的日志,在MySQL上用命令可以查看,如下:

这个值是可以修改的:

二、慢查询日志实践

1. 打开慢查询日志开关slow_query_log

在打开慢查询日志开关的时候,报错表示slow_query_log是一个global的变量(也有只影响当前session的变量,如:long_query_time 、profiling),修改后会影响所有的session,即影响所有正在访问当前MySQL server的客户端。

打开慢查询日志开关成功!

2. 设置合理的、业务可以接受的慢查询时间上限long_query_time


查看另一个session


发现还是默认的10s,故long_query_time只影响当前session

3. 压测执行各种业务


已经超过我们设置的long_query_time=0.1s

4. 查看慢查询日志

路径:/var/lib/mysql/

5. 用explain分析这些耗时的SQL语句,从而针对性优化


做了整表的搜索,把主键索引树整个扫了一遍。

我们应该给password添加索引,然后记得password是字符串格式,因为如果涉及类型转换是用不了索引的

三、show profiles查看sql具体的运行时间

MySQL一般只显示小数点后两位的时间

打开profiling开关,显示更详细的时间


没有报错,说明profiling变量只影响当前session

(0)

相关推荐

  • MySQL慢查询日志的配置与使用教程

    前言 MySQL慢查询日志是我们在日常工作中经常会遇到的一个功能,MySQL慢查询日志提供了超过指定时间阈值的查询信息,为性能优化提供了主要的参考依据,是一个非常实用的功能,MySQL慢查询日志的开启和配置非常简单,可以指定记录的文件(或者表),超过的时间阈值等就可以记录到慢sql了,实话讲,相比较sqlserver的trace或者扩展事件(虽然此二者的作用并非仅仅如此),MySQL的配置总是给人一种非常清爽的感觉. 一.慢查询日志的打开 正常情况下,只需要在配置文件中增加slow_query_

  • 详解mysql数据库如何开启慢查询日志

    数据库开启慢查询日志 修改配置文件 在配置文件my.ini中加上下面两句话 log-slow-queries = C:\xampp\mysql_slow_query.log long_query_time=3 第一句使用来定义慢查询日志的路径(若是linux系统,会涉及权限问题) 第二句使用来定义用时超过过多少秒的查询是慢查询,单位:秒. 查看配置验证是否配置成功: //查看慢查询时间,单位:s show variables like "long_query_time"; //查看慢查

  • MySQL启用慢查询日志记录方法

    在MySQL中,慢查询的界定时间是由MySQL内置参数变量long_query_time来指定的,其默认值为10(单位:秒),我们可以通过show variables like 'long_query_time';指令来查看该参数变量的信息: long_query_time的默认值为10秒 不过,在程序开发过程中,我们认为慢速查询的界定时间并没有10秒这么长,依据不同项目的不同需求,我们一般将慢查询的界定时间设定为1~5秒之间.我们可以使用指令set long_query_time = 秒数来设

  • MySQL 开启慢查询日志的方法

    1.1 简介 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能. 1.2 登录数据库查看 [root@localhost lib]# mysql –uroot 因为没有设置设置密码,有密码的在 mysql –uroot –p 接密码 1.2.1 进入MySql 查询是否开了慢查询 mysql> show variables like 'slow_query%'; +---------------------+----------

  • 对MySQL慢查询日志进行分析的基本教程

    0.首先查看当前是否开启慢查询: (1)快速办法,运行sql语句 show VARIABLES like "%slow%" (2)直接去my.conf中查看. my.conf中的配置(放在[mysqld]下的下方加入) [mysqld] log-slow-queries = /usr/local/mysql/var/slowquery.log long_query_time = 1 #单位是秒 log-queries-not-using-indexes 使用sql语句来修改:不能按照m

  • MySQL开启慢查询日志功能的方法

    mysql慢查询日志对于跟踪有问题的查询非常有用,可以分析出当前程序里是否有很耗费资源的sql语句,这是一个有用的日志.它对于性能的影响不大(假设所有查询都很快),并且强调了那些最需要注意的查询(丢失了索引或索引没有得到最佳应用),那如何打开mysql的慢查询日志记录呢? 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能. (1)配置开启 Linux: 在mysql配置文件 my.cnf 中增加如下语句: log-slow-qu

  • MYSQL5.7.9开启慢查询日志的技巧

    用MYSQL 5.7.9 作为ZABBIX 2.4.7 的监控数据库. 前段时间开启了慢查询日志, 后来发现慢查询日志膨胀到了700M 查看最后100条 大部分都是 0.1 秒的 后来想改, 以前是动态设置的 set global slow_query_log=1; 方式的 . 然后想直接用配置文件/etc/my.cnf 配慢查询 # Remove leading # and set to the amount of RAM for the most important data # cache

  • MySQL慢查询日志的基本使用教程

    慢查询日志相关参数 MySQL 慢查询的相关参数解释:slow_query_log :是否开启慢查询日志,1表示开启,0表示关闭. slow_query_log :是否开启慢查询日志,1表示开启,0表示关闭. log-slow-queries :旧版(5.6以下版本)MySQL数据库慢查询日志存储路径.可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log slow-query-log-file:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径.可以不设置该

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

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

  • MySQL优化教程之超大分页查询

    背景 基本上只要是做后台开发,都会接触到分页这个需求或者功能吧.基本上大家都是会用MySQL的LIMIT来处理,而且我现在负责的项目也是这样写的.但是一旦数据量起来了,其实LIMIT的效率会极其的低,这一篇文章就来讲一下LIMIT子句优化的. LIMIT优化 很多业务场景都需要用到分页这个功能,基本上都是用LIMIT来实现. 建表并且插入200万条数据: # 新建一张t5表 CREATE TABLE `t5` ( `id` int NOT NULL AUTO_INCREMENT, `name`

  • docker mysql容器如何开启慢查询日志

    目录 1.进入容器 登陆账号 2.查看慢日志相关信息 1.进入容器 登陆账号 docker 查看 运行的容器 docker ps 进入容器: docker exec -it dc8880c13fef /bin/bash 输入用户名密码登陆mysql mysql -u root -p 然后输入密码登陆进去 2.查看慢日志相关信息 默认慢日志是关闭的.show variables like ‘slow%’;(或者使用,看别的博主说会有版本的区别,那就使用双百分号:show variables lik

  • MySQL慢查询优化之慢查询日志分析的实例教程

    数据库响应慢问题最多的就是查询了.现在大部分数据库都提供了性能分析的帮助手段.例如Oracle中会帮你直接找出慢的语句,并且提供优化方案.在MySQL中就要自己开启慢日志记录加以分析(记录可以保存在表或者文件中,默认是保存在文件中,我们系统使用的就是默认方式). 先看看MySQL慢查询日志里面的记录长什么样的: Time Id Command Argument # Time: 141010 9:33:57 # User@Host: root[root] @ localhost [] Id: 1

  • Mysql优化技巧之Limit查询的优化分析

    前言 在实际业务中对于分页来说是一个比较常见的业务需求.那么就会使用到limit查询,当我们在使用Limit查询的时候,在数据比较小.或者只查询前面一部分数据的时候效率是很高的.但是当数据量大的时候,或者查询offset数量比较大的时候,如:limit 100000,20效率往往就不尽人意了.通常的一个办法就是Limit配合order by,如果order by有对用户的索引的话,效率通常是比较不错的. 对于这种情况,最简单的查询就是 使用覆盖索引,查询某些需要的列.这样的效果是很好的 如下面这

  • mysql优化系列 DELETE子查询改写优化

    1.问题描述 朋友遇到一个怪事,一个用子查询的DELETE,执行效率非常低.把DELETE改成SELECT后执行起来却很快,百思不得其解. 下面就是这个用了子查询的DELETE了: [yejr@imysql.com]mydb > EXPLAIN delete from trade_info where id in ( select id from ( select a.id from trade_info a, order_info b, user c where b.buyer = c.id

  • 关于Mysql通用查询日志和慢查询日志分析

    MySQL中的日志包括:错误日志.二进制日志.通用查询日志.慢查询日志等等.这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志. 1.通用查询日志:记录建立的客户端连接和执行的语句. 2.慢查询日志:记录所有执行时间超过longquerytime秒的所有查询或者不使用索引的查询 一.通用查询日志 在学习通用日志查询时,需要知道两个数据库中的常用命令: 1) show variables like '%general%'; 可以查看,当前的通用日志查询是否开启,如果general_log的

  • MySQL慢查询日志的作用和开启

    前言 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中.long_query_time的默认值为10,意思是运行10S以上的语句.默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响.慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据

随机推荐