mysql通过trace分析优化器如何选择执行计划

在我们调优MySQL的SQL时候,通常使用explain进行查看sql的执行计划。至于优化器为什么会这样选择,就无从得知。如果你想了解为什么,那么可以通过trace文件能够进一步了解为什么优化器选择A执行计划而不选择B执行计划.帮助我们更好的理解优化器的行为.
打开trace,并设置格式为Json

SET OPTIMIZER_TRACE=“enabled=on”,END_MARKERS_IN_JSON=on;

设置trace使用的内存大小,避免解析过程内存不足,文件显示不完整.

SET OPTIMIZER_TRACE_MAX_MEM_SIZE=1000000;

执行你的sql语句

select * from a, b where a.id=b.sid;

查看trace信息

SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;

TRACE json文件
{
"steps": [
{
  "join_preparation": {  ---优化准备工作
    "select#": 1,
    "steps": [
      {
        "expanded_query": "/* select#1 */ select `a`.`id` AS `id`,`a`.`name` AS `name`,`a`.`age` AS `age`,`b`.`id` AS `id`,`b`.`sid` AS `sid`,`b`.`name` AS `name`,`b`.`score` AS `score` from `a` join `b` where (`a`.`id` = `b`.`sid`)"
      }
    ] /* steps */
  } /* join_preparation */
},
{
  "join_optimization": {---优化工作的主要阶段,包括逻辑优化和物理优化两个阶段
    "select#": 1,
    "steps": [---优化工作的主要阶段, 逻辑优化阶段  
      {
        "condition_processing": {  ---逻辑优化,条件化简  
          "condition": "WHERE",
          "original_condition": "(`a`.`id` = `b`.`sid`)",
          "steps": [
            {
              "transformation": "equality_propagation",  ---逻辑优化,条件化简,等式处理
              "resulting_condition": "(`a`.`id` = `b`.`sid`)"
            },
            {
              "transformation": "constant_propagation", ---逻辑优化,条件化简,常量处理
              "resulting_condition": "(`a`.`id` = `b`.`sid`)"
            },
            {
              "transformation"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值