目录
数据库服务器的优化步骤
定位执行慢的 SQL:慢查询日志
开启慢查询日志参数
慢查询日志分析工具:mysqldumpslow
查看 SQL 执行成本:SHOW PROFILE
分析查询语句:EXPLAIN
当我们遇到数据库调优问题的时候,该如何思考呢?这里把思考的流程整理成下面这张图。 整个流程划分成了 观察(Show status) 和 行动(Action) 两个部分。字母 S 的部分代表观察(会使 用相应的分析工具),字母 A 代表的部分是行动(对应分析可以采取的行动)。
分析:①:观察服务器是否存在波动 ,存在:加入缓存或者更改缓存策略 (Mysql8.0开始没有缓存了)
②:①未解决,仍有不规则延迟或卡顿,开启慢查询,通过一些工具定位问题
③:发现SQL等待时间过长,调优服务器参数(缓冲池等)
④:发现SQL执行时间过长,索引优化,数据表设计优化(字段是否合理,范式问题,JOIN表过多优化
⑤:③、④未解决,要进行读写分离,分库分表(用资源、空间换取时间的最终计划)
概念:
session:当前会话,也就是当前连接。
global:全局,不包含当前连接,之后新获取的连接都会生效。
1.开启慢查询日志 开启slow_query_log
mysql > set global slow_query_log='ON';
你能看到慢查询分析已经开启,同时文件保存在 mysql安装目录的data目录下 主机名-slow文件中
2. 修改long_query_time阈值
mysql > show variables like '%long_query_time%';
查看默认10s
这里如果我们想把时间缩短,比如设置为 1 秒,可以这样设置:
#测试发现:设置global的方式对当前session的long_query_time失效。对新连接的客户端有效。所以可以一并
执行下述语句
mysql > set global long_query_time = 1;
mysql> show global variables like '%long_query_time%'; #当前连接立刻生效
mysql> set long_query_time=1;
mysql> show variables like '%long_query_time%'; #当前连接不生效
当然,用命令行都是临时生效配置,下次重启就无了,可以修改配置文件my.ini(windows)
log-slow-queries = E:\web\mysql\log\mysqlslowquery.log
long_query_time = 2
slow_query_log=ON
3.查看慢查询数目
SHOW GLOBAL STATUS LIKE '%Slow_queries%';
接下来的操作要在Linux中进行
在生产环境中,如果要手工分析日志,查找、分析SQL,显然是个体力活,MySQL提供了日志分析工具 mysqldumpslow 。 查看mysqldumpslow的帮助信息
mysqldumpslow --help
mysqldumpslow 命令的具体参数如下:
举例:我们想要按照查询时间排序,查看前五条 SQL 语句,这样写即可:
mysqldumpslow -s t -t 5 /var/lib/mysql/atguigu01-slow.log
工作常用参考:
#得到返回记录集最多的10个SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log
#得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/atguigu-slow.log
#得到按照时间排序的前10条里面含有左连接的查询语句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/atguigu-slow.log
#另外建议在使用这些命令时结合 | 和more 使用 ,否则有可能出现爆屏情况
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more
Show Profile是MysQL提供的可以用来分析当前会话中SQL都做了什么、执行的资源消耗情况的工具,可用于sql调优的测量。默认情况下处于关闭状态,并保存最近15次的运行结果。
我们可以在会话级别开启这个功能
通过设置 profiling='ON’ 来开启 show profile:
mysql > set profiling = 'ON';
然后执行相关的查询语句。接着看下当前会话都有哪些 profiles,使用下面这条命令:
mysql > show profiles;
你能看到当前会话一共有 2 个查询。如果我们想要查看最近一次查询的开销,可以使用:
mysql > show profile;
mysql> show profile cpu,block io for query 2; #查看某一行的其他信息(cpu,blockio)
定位了查询慢的SQL之后,我们就可以使用EXPLAIN或DESCRIBE工具做针对性的分析查询语句。DESCRIBE语句的使用方法与EXPLAIN语句是一样的,并且分析结果也是一样的。
MySQL中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息,为客户端请求的Query提供它认为最优的执行计划(他认为最优的数据检索方式,但不见得是DBA认为是最优的,这部分最耗费时间)。
这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。MySQL为我们提供了EXPLAIN语句来帮助我们查看某个查询语句的具体执行计划,大家看懂EXPLAIN语句的各个输出项,可以有针对性的提升我们查询语句的性能。
表的读取顺序
数据读取操作的
操作类型哪些索引可以使用
哪些索引被实际使用
表之间的引用
每张表有多少行被优化器查询
官方文档:
MySQL :: MySQL 5.7 Reference Manual :: 8.8.2 EXPLAIN Output Format
MySQL :: MySQL 8.0 Reference Manual :: 8.8.2 EXPLAIN Output Format
版本情况
MySQL 5.6.3以前只能 EXPLAIN SELECT ;
MYSQL 5.6.3以后就可以 EXPLAIN SELECT,UPDATE, DELETE
在5.7以前的版本中,想要显示 partitions 需要使用 explain partitions 命令;想要显示 filtered 需要使用 explain extended 命令。在5.7版本后,默认explain直接显示partitions和 filtered中的信息。
EXPLAIN 或 DESCRIBE语句的语法形式如下:
EXPLAIN SELECT select_options
或者
DESCRIBE SELECT select_options
如果我们想看看某个查询的执行计划的话,可以在具体的查询语句前边加一个 EXPLAIN ,就像这样:
mysql> EXPLAIN SELECT 1;
输出的上述信息就是所谓的执行计划。在这个执行计划的辅助下,我们需要知道应该怎样改进自己的查询语句以使查询执行起来更高效。其实除了以SELECT开头的查询语句,其余的DELETE、INSERT、REPLACE 以及UPDATE语句等都可以加上EXPLAIN,用来查看这些语句的执行计划,只是平时我们对SELECT语句更感兴趣。
注意:执行EXPLAIN时并没有真正的执行该后面的语句,因此可以安全的查看执行计划。
EXPLAIN语句输出的各个列的作用如下:
各字段含义:[MySQL高级](一) EXPLAIN用法和结果分析_王洪玉的博客-CSDN博客_explain的用法