这个专题主要讲information_ schema数据库下的一些表

如无特殊说明数据库版本为MySQL 5.7.26


## 1. OPTIMIZER_TRACE 

该表存放着针对SQL语句的优化器追踪(optimizer tracing )的相关信息,用来分析SQL语句执行情况

设置optimizer_trace系统变量来开启该功能
他有如下栏位

- QUERY  被追踪的SQL语句文本
- TRACE 追踪信息,以JSON形式表现
- MISSING_BYTES_BEYOND_MAX_MEM_SIZE  当trace信息超过了
optimizer_trace_max_mem_size 的值,则会被截断(不完整),该栏位显示丢失的字节数
- INSUFFICIENT_PRIVILEGES 如果被追踪的SQL使用了没有其权限的view或routines,则TRCE栏位为空且此栏位会显示为1



## 2. Tracing the Optimizer

这里简单说下追踪优化器


一个会话只能追踪其本身执行的语句,不能追踪其他会话的

```
SET optimizer_trace="enabled=on";

select user,host from mysql.user;

SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE\G

SET optimizer_trace="enabled=off";
```


注意该表只会显示显示一个语句的记录,后面的追踪会覆盖前一个,哪怕是存储过程中的调用

如果需要可使用如下语句调整

```
 SET optimizer_trace_offset=<OFFSET>, optimizer_trace_limit=<LIMIT>
```

我们可以针对如下语句进行追踪


 - SELECT; INSERT or REPLACE 

 - UPDATE/DELETE 

 - 以explain开头的语句

 - SET语句

 - DO; DECLARE/CASE/IF/RETURN (stored routines language elements); CALL

------------------------------


## 3. 实际截图



```
SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE\G
```

[image:857 size:orig]


[image:858 size:orig]





## 4. 参考链接


[https://dev.mysql.com/doc/refman/5.7/en/optimizer-trace-table.html](https://dev.mysql.com/doc/refman/5.7/en/optimizer-trace-table.html)

[https://dev.mysql.com/doc/internals/en/optimizer-tracing.html](https://dev.mysql.com/doc/internals/en/optimizer-tracing.html)