首先看一下MySQL追踪优化器的典型用法:
打开:SET optimizer_trace="enabled=on";
查询优化器的信息:SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
关闭:SET optimizer_trace="enabled=off";
默认情况下是关闭的,要使用的时候一定要打开这个优化器。
看一下参数:
enabled:打开或者关闭跟踪器
one_line:如果ON的话将会以JOSN的存储方式保存跟踪,但是阅读的话就是比较费劲的,除了能节省空间没啥好处,不过还是建议使用这个方式。
看一下优化器的相关参数,也可以使用mysqld --verbose --help查看:
--optimizer-trace=name 控制优化的跟踪
--optimizer-trace-features=name Enables/disables tracing of selected features of the Optimizer: optimizer_trace_features=option=val[,option=val...], where option is one of {greedy_search, range_optimizer, dynamic_range, repeated_subselect} and val is one of {on, off, default}
--optimizer-trace-limit=# 显示优化追踪器的最大数量
--optimizer-trace-max-mem-size=# 存储优化的痕迹允许的最大尺寸累积
--optimizer-trace-offset=# Offset of first optimizer trace to show; see manual --end-markers-in-json=#
In JSON output ("EXPLAIN FORMAT=JSON" and optimizer trace), if set to 1, repeats the structure's key (if it has one) near the closing bracke
而且这个是和前面所说的information_schema.OPTIMIZER_TRACE表是相对应的
SET GLOBAL optimizer_trace="one_line=on";打开追踪优化器
然后做一条操作就能看到具体的追踪优化器的信息了,通过以下的语句进行查询:
select * from information_schema.OPTIMIZER_TRACE\G;
看一下这张表的结构:
看一下字段信息:
QUERY :查询语句
TRACE :跟踪信息,是以JSON形式存储的
MISSING_BYTES_BEYOND_MAX_MEM_SIZE:
INSUFFICIENT_PRIVILEGES
追踪优化器可以跟踪很多信息,SELECT insert,replace(其值或选择) ; UPDATE / DELETE和multi-table variants;所有EXPLAIN前缀以前的; SET(除非它操纵optimizer_trace系统变量) ;做; DECLARE / CASE / IF / RETURN(存储程序语言元素) ;call。如果这些语句之一被制备并在分开的步骤中执行,preparation 和execution单独跟踪
一般情况下,一个新的跟踪都会覆盖掉以前的跟踪,特别是对于执行的语句,只能在最新的跟踪器中生成,老的跟踪器是不会产生的,这就是覆盖原则。所以我们需要对追踪优化器进行净化。看一下下面的语句:
SET optimizer_trace_offset=<OFFSET>, optimizer_trace_limit=<LIMIT>
通过上面的语句进行净化。optimizer_trace_offset和optimizer_trace_limit的默认值分别为-1和1.这个参数设置指的是什么呢:
1:当用户退出后所有的跟踪信息都会被清除
2:如果OFFSET 是大于0的相同的查询会返回到第一次查询的记录信息,OFFSET 是小于0的话这条记录就会被记录下来。
例如我们将设置以下信息的话:
OFFSET=-1 and LIMIT=1 最后一次查询信息将会被记录下来
OFFSET=-2 and LIMIT=1将会记录下一个到最后的查询信息
OFFSET=-5 and LIMIT=5 将会记录最后五次查询信息
OFFSET=0 and LIMIT=5 只会记录五次信息
OFFSET≥0的时候,内存中只会记录LIMIT调跟踪信息
SET optimizer_trace_offset=-5, optimizer_trace_limit=5;
多个语句执行N次N大于5在进行查询:
SELECT * FROM information_schema.OPTIMIZER_TRACE;
可以看到只是记录了最后的五条信息而已。
官网给出了建议的查询语句:SELECT * FROM OPTIMIZER_TRACE LIMIT LIMIT OFFSET OFFSET ;
而且我们还可以通过以下语句监控到使用的内存到底是多少:
show variables like 'optimizer_trace_max_mem_size';
而且OPTIMIZER_TRACE表的MISSING_BYTES_BEYOND_MAX_MEM_SIZE这个列还会记录到当前语句丢失了多少内存,而我们通过show variables like 'optimizer_trace_max_mem_size';查找的内存使用信息往往是和真是的偏小一点,真实内存使用往往要高。
OPTIMIZER_TRACE表的INSUFFICIENT_PRIVILEGES是用来查看权限的,当一些复杂的语句,但是查看跟踪的用户缺少权限的时候,这列值往往将显示为1。这就表示其实是没有权限的。
而且要记住一点就是跟踪器的事件如果被记录下来的话,那么也是会被自动记录到 --debug file当中的.
我们知道跟踪器的话是以JOSN存储trace的,但是JOSN的格式是很难阅读的,所以说MySQL有了以下的参数:
end_markers_in_json这个变量:
root@localhost [information_schema]>show variables like 'end_markers_in_json';
+---------------------+-------+
| Variable_name | Value |
+---------------------+-------+
| end_markers_in_json | OFF |
+---------------------+-------+
1 row in set (0.01 sec)
下面设置以下setting @@end_markers_in_json=on;打开参数以后再去查询的话就会方便的多(这个参数是5.7特有的):
或者我们使用EXPLAIN FORMAT=JSON也可以达到相同的结果。
那么问题来了,优化跟踪器有哪些特点呢,跟踪优化器可以避免多次跟踪同一个语句,这样就不会造成跟踪文件的疯狂增长。跟踪优化器主要有以下的特点:
懒查询:这样的话一个JOIN语句有N个表,最多只会产生N阶乘个执行计划
动态范围跟踪:只输出检查范围内的记录,范围内记录只会重新运行一次,但是没有运行过的记录就会重新生成一个计划。
子查询:每个字查询只会运行一次
这些功能我们是可以自己设置的:>show variables like 'optimizer_trace_features';
我们可以看一下跟踪的记录信息,可能会有点乱:
join-preparation 准备
join-optimization优化对象
join-execution最后执行
以及调用的范围内优化,成本评估,为什么选择在另一个的访问路径,为什么还是选择了另外一个排序方法,显示过的原因。距离显示一切都在发生优化远,但我们计划显示未来更多的信息。由于截图很乱,不知道你们看得到不,体验眼力劲的时候出现了。当然也可以通过前面的方式修改一下格式看一下可能更加的乐观。
我们最好将跟踪记录并且导出到文件,这样看起来更加好看
SELECT TRACE FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE into outfile'/var/lib/mysql-files/dump.sql';
如果想要其他人看不到自己的跟踪信息,一定要记得打开以下的参数:
--maximum-optimizer-trace-max-mem-size=0 --optimizer-trace-max-mem-size=0
- mysql之优化器、执行计划、简单优化
mysql之优化器.执行计划.简单优化 2018-12-12 15:11 烟雨楼人 阅读(794) 评论(0) 编辑 收藏 引用连接: https://blog.csdn.net/DrDanger/a ...
- mysql物理优化器代价模型分析【原创】
1. 引言 mysql的sql server在根据where condition检索数据的时候,一般会有多种数据检索的方法,其会根据各种数据检索方法代价的大小,选择代价最小的那个数据检索方法. 比如说 ...
- MySQL性能优化的21个最佳实践 和 mysql使用索引
1. 为查询缓存优化查询 当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了. 2. EXPLAIN SELECT 查询 ...
- MySQL filesort优化案例一则
今天遇到一个filesort优化的案例,感觉不错,分享出来. MySQL中filesort是什么意思?官方手册定义: MySQL must do an extra pass to find out h ...
- mysql语句优化总结(一)
Sql语句优化和索引 1.Innerjoin和左连接,右连接,子查询 A. inner join内连接也叫等值连接是,left/rightjoin是外连接. SELECT A.id,A.nam ...
- mysql数据库优化(转)
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...
- MySQL 高性能优化实战总结
1 前言 2 优化的哲学 3 优化思路 3.1 优化什么 3.2 优化的范围有哪些 3.3 优化维度 4 优化工具有啥? 4.1 数据库层面 4.2 数据库层面问题解决思路 4.3 系统层面 4.4 ...
- MySQL高性能优化实战总结!
1.1 前言 MySQL对于很多Linux从业者而言,是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多 ...
- MySQL性能优化方法四:SQL优化
原文链接:http://isky000.com/database/mysql-performance-tuning-sql 注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需 ...
随机推荐
- 解决错误: Failed to load class "org.slf4j.impl.StaticLoggerBinder"
当报这个错时,就很难看到我们自己输出的日志,系统运行情况后台无法得到输出.解决方案是加入以下依赖: <dependency> <groupId>org.slf4j</gr ...
- VES Hand Book Contents
3...ABOUT THE VES4...Foreword 6...Chapter 1......Introduction6......Visual Effects and Special Effec ...
- 轻松进行iPad Safari设置
推荐 通过iPad Safari设置,iPad中的Safari可以让我们看到我们想看的影片.动画和Web应用程序,关闭部分内容以保护我们的隐私安全和设备安全,至于如何进行iPad Safari设置,下 ...
- 1.ARM的基础知识
ARM简述 ARM公司既不生产芯片也不销售芯片,它只出售芯片技术授权.ARM技术具有很高的性能和功效,因而容易被厂商接受.同时,合作伙伴的增多,可获得更多的第三方工具.制造和软件支持,这又会使整个系统 ...
- php 升级排错
lnmp 环境下,升级php版本,模块都加载完成,数据库,nginx 设置都完好,但php 只能用ip 访问数据库,不能用localhost,处理要设置php.ini 的三个mysqld.sock,还 ...
- 几种加解密方法:AES、DES、SHA数据加密
一般项目都会用上加密,刚好手上的项目就用到DES加密,就贴一些代码记录一下 DES加密步奏: 1.初始化两个字符串,一个为指定的秘钥,一个为初始化向量,要求是8个字符. 2.加密:秘钥.向量.需加密的 ...
- VS里统计整个解决方案代码行数的方法
VS里统计整个解决方案代码行数,在查找里输入正则表达式:b*[^:b#/]+.*$.如下图所示: 结果如下图所示:
- Java 判断文件夹、文件是否存在、否则创建文件夹
1.判断文件是否存在,不存在创建文件 File file=new File("C:\\Users\\QPING\\Desktop\\JavaScript\\2.htm"); if( ...
- 使用百度地图API产生指定范围的随机点
直接上代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...
- 2、NASA HS3(Hurricane AND Server Storm Sentinel)
国内访问不到,但是通过ppt可以看到,数据支撑做的很到位,前台展示很炫. 气象领域WebGL应用最好案例的当之无愧啊.这篇全部贴图了. 来自为知笔记(Wiz)