博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

MySQL SQL trace

Posted on 2020-05-09 16:29  面具下的戏命师  阅读(875)  评论(0编辑  收藏  举报

MySQL SQL trace

推荐一篇博客:http://blog.itpub.net/28218939/viewspace-2658978/ 介绍的很详细

从 MySQL 5.6 开始,可以使用 trace 查看优化器如何选择执行计划,通过SQL trace来跟踪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 t_user where id = '5'

然后,通过查询information_schema库的OPTIMIZER_TRACE表,就可以获取到SQL的执行计划跟踪信息。

select * from information_schema.optimizer_trace;

trace json文件分析

                            QUERY: select * from t_user where id = '5'   --查询sql
                            TRACE: {
  "steps": [
    {
      "join_preparation": {                       
        "select#": 1,
        "steps": [
          {
            "expanded_query": "/* select#1 */ select `t_user`.`id` AS `id`,`t_user`.`username` AS `username`,`t_user`.`password` AS `password`,`t_user`.`name` AS `name` from `t_user` where (`t_user`.`id` = '5')"
          }
        ] /* steps */
      } /* join_preparation */
    },
    {
      "join_optimization": {
        "select#": 1,
        "steps": [
          {
            "condition_processing": {                                         --条件处理
              "condition": "WHERE",
              "original_condition": "(`t_user`.`id` = '5')",
              "steps": [
                {
                  "transformation": "equality_propagation",                     --等值优化
                  "resulting_condition": "(`t_user`.`id` = '5')"
                },
                {
                  "transformation": "constant_propagation",                     --常量优化
                  "resulting_condition": "(`t_user`.`id` = '5')"
                },
                {
                  "transformation": "trivial_condition_removal",                --琐碎条件排除
                  "resulting_condition": "(`t_user`.`id` = '5')"
                }
              ] /* steps */
            } /* condition_processing */
          },
          {
            "substitute_generated_columns": {                                   -- 替换生成的列
            } /* substitute_generated_columns */
          },
          {
            "table_dependencies": [                                          -- 表依赖
              {
                "table": "`t_user`",
                "row_may_be_null": false,                                   --是否有null值
                "map_bit": 0,
                "depends_on_map_bits": [
                ] /* depends_on_map_bits */
              }
            ] /* table_dependencies */
          },
          {
            "ref_optimizer_key_uses": [                                   --相关索引优化使用
              {
                "table": "`t_user`",
                "field": "id",                                           --索引字段
                "equals": "'5'",
                "null_rejecting": false
              }
            ] /* ref_optimizer_key_uses */
          },
          {
            "rows_estimation": [                                     --行评估
              {
                "table": "`t_user`",
                "rows": 1,
                "cost": 1,
                "table_type": "const",
                "empty": false
              }
            ] /* rows_estimation */
          },
          {
            "condition_on_constant_tables": "('5' = '5')",
            "condition_value": true
          },
          {
            "attaching_conditions_to_tables": {
              "original_condition": "('5' = '5')",
              "attached_conditions_computation": [
              ] /* attached_conditions_computation */,
              "attached_conditions_summary": [
              ] /* attached_conditions_summary */
            } /* attaching_conditions_to_tables */
          },
          {
            "refine_plan": [
            ] /* refine_plan */
          }
        ] /* steps */
      } /* join_optimization */
    },
    {
      "join_execution": {
        "select#": 1,
        "steps": [
        ] /* steps */
      } /* join_execution */
    }
  ] /* steps */
}
MISSING_BYTES_BEYOND_MAX_MEM_SIZE: 0
          INSUFFICIENT_PRIVILEGES: 0