五、MySQL性能优化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21918021/article/details/89222135

五、MySQL性能优化之查看执行计划explain

5.1、性能优化介绍

  • MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息,以供开发人员针对性优化。
  • 使用explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。
  • 可以通过explain命令深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。
  • EXPLAIN 命令用法十分简单, 在 SELECT 语句前加上 explain 就可以了, 例如:
    在这里插入图片描述

5.2、参数说明

expain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra,下面对这些字段进行解释:

  • id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符。
  • select_type: SELECT 查询的类型。
  • table: 查询的是哪个表。
  • partitions: 匹配的分区。
  • type: join 类型
  • possible_keys: 此次查询中可能选用的索引。
  • key: 此次查询中确切使用到的索引。
  • ref: 哪个字段或常数与 key 一起被使用。
  • rows: 显示此查询一共扫描了多少行,这个是一个估计值。
  • filtered: 表示此查询条件所过滤的数据的百分比。
  • extra: 额外的信息。

5.3、select_type列说明

  • SIMPLE, 表示此查询不包含 UNION 查询或子查询。
  • PRIMARY, 表示此查询是最外层的查询。
  • UNION, 表示此查询是 UNION 的第二或随后的查询。
  • DEPENDENT UNION, UNION 中的第二个或后面的查询语句, 取决于外面的查询。
  • UNION RESULT, UNION 的结果。
  • SUBQUERY, 子查询中的第一个 SELECT
  • DEPENDENT SUBQUERY: 子查询中的第一个 SELECT, 取决于外面的查询. 即子查询依赖于外层查询的结果。

5.4、type列说明

通常来说, 不同的 type 类型的性能关系如下:
ALL < index < range ~ index_merge < ref < eq_ref < const < system
在这里插入图片描述

5.5、MySQL性能优化之慢查询

5.5.1、性能优化的思路

  1. 首先需要使用慢查询功能,去获取所有查询时间比较长的SQL语句。
  2. 其次使用explain命令去查看有问题的SQL的执行计划。
  3. 最后可以使用show profile[s] 查看有问题的SQL的性能使用情况。

5.5.2、慢查询介绍

  • 数据库查询快慢是影响项目性能的一大因素,对于数据库,我们除了要优化 SQL,更重要的是得先找到需要优化的 SQL。
  • MySQL 数据库有一个“慢查询日志”功能,用来记录查询时间超过某个设定值的SQL,这将极大程度帮助我们快速定位到症结所在,以便对症下药。
  • 至于查询时间的多少才算慢,每个项目、业务都有不同的要求。
  • 传统企业的软件允许查询时间高于某个值,但是把这个标准放在互联网项目或者访问量大的网站上,估计就是一个bug,甚至可能升级为一个功能性缺陷。
  • MySQL的慢查询日志功能,默认是关闭的,需要手动开启。

5.5.3、开启慢查询功能

5.5.3.1、查看是否开启慢查询功能

在这里插入图片描述

参数说明:

  • slow_query_log :是否开启慢查询日志,ON 为开启,OFF 为关闭,如果为关闭可以开启。
  • log-slow-queries :旧版(5.6以下版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
  • slow-query-log-file:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
  • long_query_time :慢查询阈值,当查询时间多于设定的阈值时,记录日志,单位为秒。

5.5.3.2、临时开启慢查询功能

在 MySQL 执行 SQL 语句设置,但是如果重启 MySQL 的话将失效

set global slow_query_log = ON;
set global long_query_time = 1;

在这里插入图片描述

5.5.3.3、永久开启慢查询功能

修改/etc/my.cnf配置文件,重启 MySQL, 这种永久生效.

[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1

在这里插入图片描述

5.5.3.4、慢日志格式

在这里插入图片描述
在这里插入图片描述
格式说明:

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

5.5.4、分析慢查询日志

5.5.4.1、MySQL自带的mysqldumpslow

[root@localhost mysql]# mysqldumpslow /var/lib/mysql/localhost-slow.log

常用参数说明:

  • s:是表示按照何种方式排序
    在这里插入图片描述
  • t:是top n的意思,即为返回前面多少条的数据
  • g:后边可以写一个正则匹配模式,大小写不敏感的

示例:

得到按照时间排序的前10条里面含有左连接的查询语句。
mysqldumpslow -s t -t 10 -g “left join/var/lib/mysql/localhost_slow.log

5.5.4.2、使用mysqlsla 工具

mysqlsla工具,功能非常强大。数据报表,非常有利于分析慢查询的原因,包括执行频率,数据量,查询消耗等。
不过此工具已停止维护,项目 github 介绍页面推荐使用 percona-toolkit,下面有介绍。
mysqlsla -lt /var/log/mysql/slow.log

5.5.4.2、使用percona-toolkit工具

percona-toolkit是一组高级命令行工具的集合,可以查看当前服务的摘要信息,磁盘检测,分析慢查询日志,查找重复索引,实现表同步等等。
下载
https://www.percona.com/downloads/percona-toolkit/3.0.11/binary/tarball/percona-toolkit-3.0.11_x86_64.tar.gz

安装

	 tar -xf percona-toolkit-3.0.11_x86_64.tar.gz
	 cd percona-toolkit-3.0.11
	 perl Makefile.PL
	 make
	 make install

调错

Can't locate ExtUtils/MakeMaker.pm in @INC 错误的解决方式:
 yum install -y perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker

Can't locate Time/HiRes.pm in @INC
 yum install -y perl-Time-HiRes

使用pt-query-digest查看慢查询日志

pt-query-digest /var/lib/mysql/localhost-slow.log

5.6、MySQL性能分析语句show profile

5.6.1、介绍

  • Query Profiler是MYSQL自带的一种query诊断分析工具,通过它可以分析出一条SQL语句的性能瓶颈在什么地方。
  • 通常我们是使用的explain,以及slow query log都无法做到精确分析,但是Query Profiler却可以定位出一条SQL语句执行的各种资源消耗情况,比如CPU,IO等,以及该SQL执行所耗费的时间等。不过该工具只有在MYSQL5.0.37以及以上版本中才有实现。
  • 默认的情况下,MYSQL的该功能没有打开,需要自己手动启动。

5.6.2、语句使用

  • show profile 和 show profiles 语句可以展示当前会话(退出session后,profiling重置为0)中执行语句的资源使用情况。
  • show profiles :以列表形式显示最近发送到服务器上执行的语句的资源使用情况.显示的记录数由变量:profiling_history_size
    控制,默认15条。
    在这里插入图片描述
  • show profile: 展示最近一条语句执行的详细资源占用信息,默认显示 Status和Duration两列。
    在这里插入图片描述
    show profile 还可根据 show profiles 列表中的 Query_ID ,选择显示某条记录的性能分析信息。
    在这里插入图片描述

5.6.3、开启Profile功能

  • Profile 功能由MySQL会话变量 : profiling控制,默认是OFF关闭状态。
  • 查看是否开启了Profile功能:
	 select @@profiling;
	 show variables like%profil%;

在这里插入图片描述

  • 开启profile功能
set profiling=1; --1是开启、0是关闭

5.6.4、示例

  1. 查看是否打开了性能分析功能
select @@profiling

在这里插入图片描述

  1. 打开 profiling 功能
set profiling=1

在这里插入图片描述

  1. 执行sql语句

在这里插入图片描述

  1. 执行 show profiles 查看分析列表

在这里插入图片描述

  1. 查询第二条语句的执行情况
show profile for query 2;

在这里插入图片描述

  1. 可指定资源类型查询
show profile cpu,swaps for query 2; 

在这里插入图片描述

5.7、MySQL性能优化细节

  • 合理的创建及使用索引(考虑数据的增删情况)
  • 合理的冗余字段(尽量建一些大表,考虑数据库的三范式和业务设计的取舍)
  • 使用SQL要注意一些细节:select语句中尽量不要使用*、count(*),WHERE语句中尽量不要使用1=1、in语句(建议使用exists)、注意组合索引的创建顺序按照顺序组着查询条件、尽量查询粒度大的SQL放到最左边、尽量建立组合索引。
  • 合理利用慢查询日志、explain执行计划查询、show profile查看SQL执行时的资源使用情况。

猜你喜欢

转载自blog.csdn.net/qq_21918021/article/details/89222135