1.进入mysql

1.1win10进入mysql安装路径(以下大部分命令使用win10环境的mysql服务):

mysql docker 性能低 docker mysql 慢_mysql docker 性能低

1.2进入Linux(CentOS7)+docker+mysql容器

进入docker容器:
docker attach 容器id
或
docker exec -it 容器名 /bin/bash

退出docker容器:
按ctr+D

mysql docker 性能低 docker mysql 慢_perl_02

2.跳过授权表验证进入服务:

mysqld --skip-grant-tables     //此时,启动MySQL的镜像,跳过授权表验证进入服务

mysql docker 性能低 docker mysql 慢_数据库_03


mysql docker 性能低 docker mysql 慢_慢查询_04

3.查看mysql慢查询时间(mysql默认查询时间超过10s,该查询操作即为慢查询):

mysql docker 性能低 docker mysql 慢_慢查询_05

4.修改慢查询时间

一下语句的意思是:查询时间 > 666 秒 (而不是>=),为被视为慢查询,(重启后恢复原默认值)

mysql docker 性能低 docker mysql 慢_mysql docker 性能低_06

5.记录慢查询

mysql docker 性能低 docker mysql 慢_数据库_07

6.mysql设置开启慢查询日志

适用于不允许重启服务器的情况

mysql docker 性能低 docker mysql 慢_perl_08


mysql docker 性能低 docker mysql 慢_慢查询_09

7.截止到目前,查询当前产生了多少条慢查询记录

mysql docker 性能低 docker mysql 慢_mysql_10

8.启动慢查询日志

8.1 使用mysql命令开启慢查询

设置开启慢查询:

mysql docker 性能低 docker mysql 慢_perl_11


设置超过1秒就记录日志:

mysql docker 性能低 docker mysql 慢_mysql docker 性能低_12


mysql5.1版本之后,long_query_time以微秒记录时间

mysql docker 性能低 docker mysql 慢_慢查询_13


变量log_queries_not_using_indexes设置为ON时,如果sql语句没有使用索引,则该语句将同样会被记录进慢查询日志。

mysql docker 性能低 docker mysql 慢_慢查询_14


mysql5.6.5版本之后新增了一个参数

log_throttle_queries_not_using_indexes用来表示每分钟允许记录到slow log的且未使用到索引的SQL语句次数,默认该值为0:表示没有限制。

mysql docker 性能低 docker mysql 慢_慢查询_15

8.2 使用配置文件设置,windows环境下修改my.ini文件,添加如下命令:

# 开启慢查询日志,定义查询时间超过多少秒的查询叫做慢查询,这里定义的是超过2s
slow_query_log=2

# 设置阈值 `0.5` 秒
long_query_time=0.5

log_queries_not_using_indexes=ON

#设置慢查询日志存储位置和文件名
slow_query_log_file="/var/log/mysql/mysql_slow.log"

9.创建数据库和表,写存储过程循环插入大量数据,以便产生存储慢查询日志

9.1创建数据库和表

create database big_data;
use big_data;

创建表data_info的表结构如下:

mysql docker 性能低 docker mysql 慢_mysql docker 性能低_16

9.2写存储过程插入大量数据

创建存储过程:

mysql docker 性能低 docker mysql 慢_perl_17


调用存储过程之前,先查看一下当前是否有慢查询记录:

mysql docker 性能低 docker mysql 慢_perl_18


调用存储过程,往数据库里面插入数据,可以看到该过程耗时43.65s,已经查过系统变量long_query_time(之前设置的2s)的值,按理说应该会产生慢查询日志。

mysql docker 性能低 docker mysql 慢_慢查询_19


我们可以使用命令show global status like '%slow_queries%';来查看当前是否有慢查询产生:

mysql docker 性能低 docker mysql 慢_数据库_20

10.分析慢查询日志——使用分析处理日志的工具

查看慢查询日志所在目录:

mysql docker 性能低 docker mysql 慢_慢查询_21


按Ctr+Z退出mysql操作命令模式,在Linux环境下,查看以上图片标记的目录下的慢查询日志内容

10.1 使用mysql程序自带的mysqldumpslow命令分析

mysql docker 性能低 docker mysql 慢_mysql_22


mysql docker 性能低 docker mysql 慢_mysql_23

10.2 如果慢查询日志较大,可使用tail命令查看部分内容

如:

mysql docker 性能低 docker mysql 慢_慢查询_24


字段意义解析:

第一行,SQL查询执行的时间 第二行,执行SQL查询的连接信息,用户和连接IP 第三行,记录了一些我们比较有用的信息,如下解析:

  • Query_time,这条SQL执行的时间,越长则越慢
  • Lock_time,在MySQL服务器阶段(不是在存储引擎阶段)等待表锁时间
  • Rows_sent,查询返回的行数
  • Rows_examined,查询检查的行数,越长就当然越费时间
    第四行,设置时间戳,没有实际意义,只是和第一行对应执行时间。
    第五行及后面所有行(第二个# Time:之前),执行的sql语句记录信息,因为sql可能会很长。

10.3 使用pt(Percona Toolkit)工具的pt-query-digest进行统计分析。

这个是由Percona公司出品的一个用perl编写的脚本,只有安装上pt工具集才会存在,有兴趣的朋友就要先安装pt工具了。

yum install perl-CPAN perl-Time-HiRes perl-DBI perl-DBD-MySQL perl-IO-Socket-SSL
yum install https://www.percona.com/downloads/percona-toolkit/3.0.13/binary/redhat/7/x86_64/percona-toolkit-3.0.13-1.el7.x86_64.rpm

直接分析慢查询文件,执行如下:

pt-query-digest slow_querys.log >t.txt

10.4 如果用户希望得到执行时间最长的10条SQL语句,可以运行以下命令:

mysqldumpslow -s al -n 10  /var/lib/mysql/6b083274647b-slow.log