MySQL5.6的optimizer_trace

MySQL的explain是各种执行计划选择的结果,如果想看整个执行计划以及对于多种索引方案之间是如何选择的?

MySQL5.6中支持这个功能,optimizer_trace

这个是mysql的参数,默认是关闭的


1

2

3

4

5

6

7

8

9

10

11

12

13

14

mysql> set optimizer_trace="enabled=on";

Query OK, 0 rows affected (0.00 sec)

mysql> show variables like ‘%optimizer_trace%‘;

+------------------------------+----------------------------------------------------------------------------+

| Variable_name                | Value                                                                      |

+------------------------------+----------------------------------------------------------------------------+

| optimizer_trace              | enabled=on,one_line=off                                                    |

| optimizer_trace_features     | greedy_search=on,range_optimizer=on,dynamic_range=on,repeated_subselect=on |

| optimizer_trace_limit        | 1                                                                          |

| optimizer_trace_max_mem_size | 16384                                                                      |

| optimizer_trace_offset       | -1                                                                         |

+------------------------------+----------------------------------------------------------------------------+

rows in set (0.00 sec)

  

具体这么使用呢?

需要设置如下:

1、开启optimizer_trace,默认是关闭的


1

SET optimizer_trace="enabled=on";  

 

2、设置optimizer_trace内存的大小


1

SET OPTIMIZER_TRACE_MAX_MEM_SIZE=1000000

  

3、explain查询语句


1

2

3

4

5

6

7

8

9

10

11

12

13

mysql> explain SELECT FROM atomuser WHERE  `uid` =28778731 AND ptype =  "photo" LIMIT 0 , 1\G

*************************** 1. row ***************************

           id: 1

  select_type: SIMPLE

        table: atomuser

         type: ref

possible_keys: uid

          key: uid

      key_len: 15

          ref: const,const

         rows: 1

        Extra: Using index condition

1 row in set (0.01 sec)

  

4、查找对于的结果


1

mysql> select from information_schema.optimizer_trace\G

 

这个表包括4个字段 


1

2

3

4

5

6

7

8

9

mysql> show create table information_schema.optimizer_trace\G

*************************** 1. row ***************************

       Table: OPTIMIZER_TRACE

Create TableCREATE TEMPORARY TABLE `OPTIMIZER_TRACE` (

  `QUERY` longtext NOT NULL,

  `TRACE` longtext NOT NULL,

  `MISSING_BYTES_BEYOND_MAX_MEM_SIZE` int(20) NOT NULL DEFAULT ‘0‘,

  `INSUFFICIENT_PRIVILEGES` tinyint(1) NOT NULL DEFAULT ‘0‘

) ENGINE=MyISAM DEFAULT CHARSET=utf8

 

主要看TRACE字段,是json串,json解析结果如下: 

包括join_preparation,join_optimization,join_explain

join_preparation


1

"/* select#1 */ select `atomuser`.`id` AS `id`,`atomuser`.`uid` AS `uid`,`atomuser`.`ptype` AS `ptype`,`atomuser`.`regtime` AS `regtime` from `atomuser` where ((`atomuser`.`uid` = 28778731) and (`atomuser`.`ptype` = ‘photo‘)) limit 0,1"

 

这个是使用extend看到的结果 


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

mysql> explain extended SELECT FROM atomuser WHERE  `uid` =28778731 AND ptype =  "photo" LIMIT 0 , 1\G

*************************** 1. row ***************************

           id: 1

  select_type: SIMPLE

        table: atomuser

         type: ref

possible_keys: uid

          key: uid

      key_len: 15

          ref: const,const

         rows: 1

     filtered: 100.00

        Extra: Using index condition

1 row in set, 1 warning (0.01 sec)

mysql> show warnings\G

*************************** 1. row ***************************

  Level: Note

   Code: 1003

Message: /* select#1 */ select `test`.`atomuser`.`id` AS `id`,`test`.`atomuser`.`uid` AS `uid`,`test`.`atomuser`.`ptype` AS `ptype`,`test`.`atomuser`.`regtime` AS `regtime` from `test`.`atomuser` where ((`test`.`atomuser`.`ptype` = ‘photo‘and (`test`.`atomuser`.`uid` = 28778731)) limit 0,1

1 row in set (0.00 sec)

  

[参考资料]

1、http://guilhembichot.blogspot.com/2011/09/optimizer-tracing-how-to-configure-it.html

时间: 2024-11-07 09:12:52

MySQL5.6的optimizer_trace的相关文章

[MySQL5.6] 一个简单的optimizer_trace示例

[MySQL5.6] 一个简单的optimizer_trace示例 前面已经介绍了如何使用和配置MySQL5.6中optimizer_trace(点击博客),本篇我们以一个相对简单的例子来跟踪optimizer_trace的产生过程. 本文的目的不是深究查询优化器的实现,只是跟踪optimizer trace在优化器的那一部分输出,因此很多部分只是一带而过,对于需要深究的部分,暂时标注为红色,后续再扩展阅读;之前一直没看过这部分代码,理解起来还是比较困难的… 我们以一个简单的表为例过一下opti

单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式

单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式 一 表结构如下:  MySQL  5.5.30  5.6.20 版本, 表大概有815万行 CREATE TABLE t_audit_operate_log (  Fid bigint(16) AUTO_INCREMENT,  Fcreate_time int(10) unsigned NOT NULL DEFAULT '0',  Fuser varchar(50) DEFAULT '',  Fip bigint

mysql 执行计划分析三看, explain,profiling,optimizer_trace

http://blog.csdn.net/xj626852095/article/details/52767963 step 1 使用explain 查看执行计划, 5.6后可以加参数 explain format=json xxx 输出json格式的信息 step 2  使用profiling详细的列出在每一个步骤消耗的时间,前提是先执行一遍语句. #打开profiling 的设置 SET profiling = 1; SHOW VARIABLES LIKE '%profiling%'; #查

编译安装MYSQL5.6.26--【动手实验】

mysql编译详细参数官方地址 http://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html 自5.5以后的版本都需要cmake编译安装,so...先安装cmake编译器 安装必要的组件  yum -y install cmake  yum -y install bison  yum -y install ncurses-devel     添加账户  groupadd mysql  useradd mysql 

mysql5.7 代价模型浅析

代价模型 mysql 5.7.10代价计算相对之前的版本有5.7 代价模型浅析较大的改进.例如 代价模型参数可以动态配置,可以适应不同的硬件 区分考虑数据在内存和在磁盘中的代价 代价精度提升为浮点型 jion计算时不仅要考虑condition,还要考虑condition上的filter,具体参见参数condition_fanout_filter 5.7 在代价类型上分为io,cpu和memory, 5.7的代价模型还在完善中,memory的代价虽然已经收集了,但还没有没有计算在最终的代价中.5.

mysql5.6.16下跟踪SQL查询转换的结果

当SQL执行时,会做一些查询转换,你看到的SQL很可能被转换为其他的形式的SQL执行(有视图重写,查询转换,谓词推进等).在Oracle下,可以通过10053跟踪SQL语句.在mysql下,可以通过设置optimizer_trace来实现. mysql> select version(); +-----------+ | version() | +-----------+ | 5.6.16    | +-----------+ 1 row in set (0.00 sec) mysql> cr

mysql5.7 innodb数据库备份工具Xtrabackup的安装

mysql5.7 innodb数据库备份工具Xtrabackup的安装     wget mhttps://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.7/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.7-1.el6.x86_64.rpm Mysql5.7需要安装XtraBackup 2.4.1以上版本 官网地址 https://www.percona.com/down

windows下mysql-5.7.18安装

在官网下载了mysql压缩包,按照官网:https://dev.mysql.com/doc/refman/5.7/en/windows-installation.html的教程安装,但是出错,后面根据https://www.oschina.net/question/1244397_2138435解决了问题.下面是详细的安装步骤.(当然建议直接下载msi安装文件进行安装,出错也比较少) 1.设置环境变量:在path系统变量添加mysql的bin路径,我把压缩包解压到d盘,这里路径是D:\mysql

centos6.7下安装mysql5.6.22同时解决中文乱码问题

1.下载 http://dev.mysql.com/downloads/mysql/ 或者使用wget下载: wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-5.6.22-1.el6.i686.rpm-bundle.tar 2.安装 2.1.  检测是否已经安装了mysql rpm -qa | grep mysql 如果已经安装了,将其卸载,如: rpm -e --nodeps  mysql-libs-5.1.71-1.el6.x8