SlideShare ist ein Scribd-Unternehmen logo
1 von 50
1   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
Powerful EXPLAIN in
MySQL 5.6
Evgeny Potemkin
MySQL Optimizer team




2   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
Program Agenda


         Introduction
         Optimizer trace
         EXPLAIN in JSON format
         Explaining INSERT, UPDATE, DELETE




3   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
Graphic Section Divider




4   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
Optimizer Trace




5   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
Optimizer trace: quick start
mysql> SET optimizer_trace= “enabled=on“,
             end_markers_in_json=on;
mysql> SELECT * FROM orders WHERE customer_id <> 6;
mysql> SELECT trace FROM
   information_schema.OPTIMIZER_TRACE;
mysql> SET optimizer_trace="enabled=off";
    QUERY                                                                                                         SELECT * FROM orders WHERE customer_id <> 6
    TRACE                                                                                                          “steps”: [ { "join_preparation": { "select#": 1,… } … } …]
    MISSING_BYTES_BEYOND_MAX_MEM_SIZE                                                                              0
    INSUFFICIENT_PRIVILEGES                                                                                        0


6    Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
Optimizer trace: what’s inside
 Steps
         – Join preparation
                       Modifications to subquery
                       Expanded query
         – Join optimization
                       Range optimizer info
                       Plan generation process
                       Condition optimization
                       Processing of ORDER/GROUP BY
         – Join execution
                       Tmp tables related info
7   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
Optimizer trace: example
mysql> SET optimizer_trace="enabled=on";
mysql> SELECT * FROM t1,t2 WHERE f1=1 AND f1=f2 AND f2>0;
mysql> SELECT trace FROM information_schema.optimizer_trace;
mysql> SET optimizer_trace="enabled=off";




8   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
Optimizer trace: example
    join_optimization / steps / condition_processing
    "condition": "WHERE",
    "original_condition": "((`t1`.`f1` = 1) and (`t1`.`f1` = `t2`.`f2`) and (`t2`.`f2` > 0))",
    "steps": [
     {
         "transformation": "equality_propagation",
         "resulting_condition": "((`t2`.`f2` > 0) and multiple equal(1, `t1`.`f1`, `t2`.`f2`))"
     }, {
         "transformation": "constant_propagation",
         "resulting_condition": "((1 > 0) and multiple equal(1, `t1`.`f1`, `t2`.`f2`))"
     }, {
         "transformation": "trivial_condition_removal",
         "resulting_condition": "multiple equal(1, `t1`.`f1`, `t2`.`f2`)"
     }
    ] /* steps */


9    Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
Optimizer trace: example
     join_optimization / row_estimation / table : t1, range_analysis
     "table_scan": {                                                                                                             "analyzing_range_alternatives": {
      "rows": 5,                                                                                                                    "range_scan_alternatives": [ {
      "cost": 5.1085                                                                                                                      "index": "f1",
     } /* table_scan */,                                                                                                                  "ranges": [ "1 <= f1 <= 1“ ] /* ranges */,
     "potential_range_indices": [ {                                                                                                       "index_dives_for_eq_ranges": true,
        "index": "f1",                  "usable": true,                                                                                   "rows": 2, "cost": 3.41,
        "key_parts": [ "f1“ ] /* key_parts */ }                                                                                           "chosen": false,
     ] /* potential_range_indices */,                                                                                                     "cause": "cost"
     "best_covering_index_scan": {                                                                                                    }
      "index": "f1", "cost": 2.093, "chosen": true                                                                                  ] /* range_scan_alternatives */,
     } /* best_covering_index_scan */,                                                                                              "analyzing_roworder_intersect": {
     "group_index_range": {                                                                                                           "usable": false, "cause": "too_few_roworder_scans"
      "chosen": false, "cause": "not_single_table"                                                                                  } /* analyzing_roworder_intersect */
     } /* group_index_range */,                                                                                                  } /* analyzing_range_alternatives */


10    Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
Optimizer trace: example
     join_optimization / considered_execution_plan
     "plan_prefix": [ ] /* plan_prefix */,                                                                                        "plan_prefix": [ "`t2`“ ] /* plan_prefix */,
     "table": "`t2`",                                                                                                                 "table": "`t1`",
     "best_access_path": {                                                                                                            "best_access_path": {
      "considered_access_paths": [ {                                                                                                     "considered_access_paths": [ {
          "access_type": "scan", "rows": 3,                                                                                                      "access_type": "ref", "index": "f1",
          "cost": 2.6051, "chosen": true                                                                                                         "rows": 2, "cost": 3.4698, "chosen": true
      } ] /* considered_access_paths */                                                                                                    }, {
     } /* best_access_path */,                                                                                                                   "access_type": "scan", "using_join_cache": true,
     "cost_for_plan": 2.6051,                                                                                                                    "rows": 2, "cost": 3.8087,
     "rows_for_plan": 3,                                                                                                                         "chosen": true
     "rest_of_plan": [ {                                                                                                              } ] } /* best_access_path */,
     … next iteration … =>                                                                                                            "cost_for_plan": 6.4138,
     } ] /* rest_of_plan */                                                                                                           "rows_for_plan": 6,
                                                                                                                                      "chosen": true


11    Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
Optimizer trace: example
     join_optimization / plan refinement
     {                                                                                                                               {
            "attaching_conditions_to_tables": {                                                                                          "refine_plan": [
            "original_condition":                                                                                                         {
              "((`t1`.`f1` = 1) and (`t2`.`f2` = 1))",                                                                                        "table": "`t1`"
             "attached_conditions_summary": [ {                                                                                           },
                  "table": "`t1`", "attached": null                                                                                       {
              }, {                                                                                                                            "table": "`t2`",
                  "table": "`t2`", "attached": "(`t2`.`f2` = 1)"                                                                              "access_type": "table_scan"
              }                                                                                                                           }
            ] /* attached_conditions_summary */                                                                                          ] /* refine_plan */
         } /* attaching_conditions_to_tables */                                                                                      }
     },




12        Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
Optimizer trace: controls
  optimizer-trace
  optimizer-trace-features
          – greedy_search
          – range_optimizer
          – dynamic_range
          – repeated_subselect
  optimizer-trace-limit
  optimizer-trace-offset
  optimizer-trace-max-mem-size
  end-markers-in-json

13   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
Optimizer trace: exploring
  mysql> pager less
  SELECT TRACE INTO DUMPFILE <filename> FROM
   INFORMATION_SCHEMA.OPTIMIZER_TRACE;
  JSONView for Firefox
  Pretty JSON for Chrome
  A registry patch for IE




14   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON format




15   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
Traditional EXPLAIN
id select type table                                            type              possible                       key                             key len ref        rows   extra
                                                                                  keys
     1 PRIMARY                        cust                       index            cust_id,                        cust_name                      40      const      10    Using where; Start
                                                                                  cust_name                                                                               materialize; Scan
     1 PRIMARY                        orders                     ref              order_id                        order_id                       8       ordid      32    Using where; End
                                                                                                                                                                          materialize; Using join
                                                                                                                                                                          buffer (Block Nested
                                                                                                                                                                          Loop)
     1 PRIMARY                        <derived2> ref                               <auto_key0> <auto_key0>                                       23      vc1        100   Using index
     2 DERIVED                        flights    ALL                               NULL        NULL                                              NULL    NULL       10000 Using where; Start
                                                                                                                                                                          materialize; Scan
     2 DERIVED                        storage                    eq_ref            PRIMARY                        PRIMARY                        8       fl_store   1     Using where; End
                                                                                                                                                                          materialize; Using join
                                                                                                                                                                          buffer (Block Nested
                                                                                                                                                                          Loop)
     4 SUBQUERY buzz                                             range             buzzez                         buzzez                         11      NULL       42    Using index; Using
                                                                                                                                                                          where
     6 SUBQUERY shortage                                         index             shrt_idx                       shrt_idx                       100     NULL       243   Using index; Using
                                                                                                                                                                          where

16    Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
Traditional EXPLAIN: Cons
  Hard to read in complex cases
  Unclear/non-obvious query structure in complex cases
          – Could take quite some time to see what’s going on
  Limited information about query plan
          – How conditions are split? When a subquery is evaluated?
  Hard to impossible to extend
          – Indication of a feature being used usually is limited to “Using <something>”




17   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: Basics
 mysql> EXPLAIN SELECT * FROM t1;
     id          select type                            table                   type            possible keys                               key     key len   ref    rows   extra
     1            SIMPLE                                 t1                     index           NULL                                         i      5         NULL   3      NULL




18       Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: Basics
                                                                                                                                          EXPLAIN
                                                                                                                                                "query_block": {
                                                                                                                                                 "select_id": 1,
                                                                                                                                                 "table": {
                                                                                                                                                  "table_name": "t1",
 mysql> EXPLAIN FORMAT=JSON                                                                                                                       "access_type": "index",
 SELECT * FROM t1;                                                                                                                                "key": "i",
                                                                                                                                                  "key_length": "5",
                                                                                                                                                  "rows": 3,
                                                                                                                                                  "filtered": 100,
                                                                                                                                                  "using_index": true
                                                                                                                                                 } /* table */
                                                                                                                                                } /* query_block */




19   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: Basics
 mysql> set end_markers_in_json = on;
     end_markers_in_json = off                                                                                                  end_markers_in_json = on
                                              }                                                                                                             } /* table */
                                          }                                                                                                               } /* query_block */
                                      }                                                                                                               }
                                  ]                                                                                                                 ] /* query_specifications */
                              }                                                                                                                    } /* union_result */
                          }                                                                                                                       } /* query_block */
                      }                                                                                                                          } /* materialized_from_subquery */
                  }                                                                                                                        } /* table */
              }                                                                                                                          } /* grouping_operation */
          }                                                                                                                           } /* ordering_operation */
      }                                                                                                                             } /* query_block */



20    Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: Basics
 mysql> EXPLAIN SELECT * FROM t1 WHERE str IS NULL AND id > 0;
     id          select type                            table                   type             possible keys                               key     key len   ref     rows   extra
     1            SIMPLE                                 t1                     ref              str                                          str    11        const   1      Using index
                                                                                                                                                                              condition;
                                                                                                                                                                              Using where




21       Copyright © 2012, Oracle and/or its affiliates. All rights reserved.    Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: Basics
                                                                                                                                          EXPLAIN
                                                                                                                                            "query_block": {
                                                                                                                                                 "select_id": 1,
                                                                                                                                                 "table": {
                                                                                                                                                  "table_name": "t1",
 mysql> EXPLAIN FORMAT=JSON                                                                                                                       "access_type": "ref",
 SELECT * FROM t1 WHERE str IS                                                                                                                    "possible_keys": [ "str“ ],
                                                                                                                                                  "key": "str", "key_length": "11",
 NULL AND id > 0;
                                                                                                                                                  "ref": [ "const"],
                                                                                                                                                  "rows": 1, "filtered": 100,
                                                                                                                                                  "index_condition": "isnull(`test`.`t1`.`str`)“
                                                                                                                                                  "attached_condition": "(`test`.`t1`.`id` > 0)"
                                                                                                                                                 } /* table */
                                                                                                                                                } /* query_block */



22   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: Basics
 mysql> EXPLAIN PARTITIONS SELECT * FROM t1 WHERE a
 BETWEEN '0000-00-00' AND '1001-01-01';
                                                                                                                             possible                     key
     id          select type                      partitions                          table               type                                      key         ref    rows   extra
                                                                                                                             keys                         len
     1            SIMPLE                           pNULL,                             t1                  index              a                      a     4     NULL   6      Using where;
                                                   p0001-01-01,                                                                                                               Using index
                                                   p1001-01-01




23       Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: Basics
                                                                                                                                          EXPLAIN
                                                                                                                                            "query_block": {
                                                                                                                                                "select_id": 1,
                                                                                                                                                "table": {
                                                                                                                                                 "table_name": "t1",
 mysql> EXPLAIN FORMAT=JSON                                                                                                                      "partitions": [ "pNULL", "p0001-01-01",
 SELECT * FROM t1 WHERE a                                                                                                                            "p1001-01-01"],
                                                                                                                                                 "access_type": "index",
 BETWEEN '0000-00-00' AND '1001-
                                                                                                                                                 "possible_keys": [ "a" ],
 01-01';                                                                                                                                         "key": "a", "key_length": "4",
                                                                                                                                                 "rows": 6, "filtered": 33.333,
                                                                                                                                                 "using_index": true,
                                                                                                                                                 "attached_condition": "(`test`.`t1`.`a` between
                                                                                                                                                     '0000-00-00' and '1001-01-01')"
                                                                                                                                                }}


24   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: Basics
 mysql> EXPLAIN SELECT * FROM t1 JOIN t2 USING(i);
                                                                                              possible                                         key
     id          select type                          table                type                                           key                         ref    rows   extra
                                                                                              keys                                             len
     1            SIMPLE                               t2                  ALL                NULL                         NULL                NULL   NULL   3      NULL

     1            SIMPLE                               t1                  index              i                            i                   5      NULL   3      Using where; Using
                                                                                                                                                                    index; Using join
                                                                                                                                                                    buffer (Block Nested
                                                                                                                                                                    Loop)




25       Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: Basics
     EXPLAIN
     {                                                                                                                               {
         "query_block": {                                                                                                                  "table": {
           "select_id": 1,                                                                                                                   "table_name": "t1",
           "nested_loop": [                                                                                                                  "access_type": "index",
             {                                                                                                                               "possible_keys": [ "i" ],
                 "table": {                                                                                                                  "key": "i", "key_length": "5",
                   "table_name": "t2",                                                                                                       "rows": 3, "filtered": 100,
                   "access_type": "ALL",                                                                                                     "using_index": true,
                   "rows": 3,                                                                                                                "using_join_buffer": "Block Nested Loop",
                   "filtered": 100                                                                                                           "attached_condition":
                 } /* table */                                                                                                                      "(`test`.`t1`.`i` = `test`.`t2`.`i`)"
             },                                                                                                                            } /* table */
            … next table … =>                                                                                                        }
         ] } /* nested_loop */ } /* query_block */


26       Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: Basics
         MySQL Workbench 5.2




 SELECT * FROM t1 JOIN t2 USING(i);




27   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: more complex queries
 mysql> EXPLAIN FORMAT=JSON SELECT t1.a, MIN(t2.b)
 FROM t1 LEFT JOIN t2 ON t1.a=t2.a GROUP BY t1.a ORDER BY t1.b;

     id         select type                       table              type             possible keys                         key                     key len          ref   rows   extra
     1           SIMPLE                            t1                 ALL             NULL                                   NULL                   NULL      NULL         3      Using temporary;
                                                                                                                                                                                  Using filesort
     1           SIMPLE                            t2                 ref             PRIMARY                                PRIMARY                4         test.t1.a    1      Using index




28       Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: more complex queries
                                                                                                                                          EXPLAIN
                                                                                                                                            "query_block": {
 mysql> EXPLAIN FORMAT=JSON                                                                                                                      "select_id": 1,

 SELECT t1.a, MIN(t2.b)                                                                                                                          "ordering_operation": {
                                                                                                                                                  "using_temporary_table": true,
 FROM t1 LEFT JOIN t2                                                                                                                             "using_filesort": true,
                                                                                                                                                  "grouping_operation": {
  ON t1.a=t2.a
                                                                                                                                                    "using_filesort": true,
 GROUP BY t1.a ORDER BY t1.b;                                                                                                                       "nested_loop": [
                                                                                                                                                      { “table” : {…} },
                                                                                                                                                      { “table” : {…} } ] /* nested_loop */
                                                                                                                                                  } /* grouping_operation */
                                                                                                                                                 } /* ordering_operation */
                                                                                                                                                } /* query_block */



29   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: more complex queries
         MySQL Workbench 5.2

 SELECT t1.a, MIN(t2.b)
 FROM t1 LEFT JOIN t2
  ON t1.a=t2.a
 GROUP BY t1.a ORDER BY t1.b;




30   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: more complex queries
 mysql> EXPLAIN SELECT a, b FROM
 (SELECT 1 AS a, 2 AS b UNION ALL SELECT 1 AS a, 2 AS b) t1
 GROUP BY a ORDER BY b DESC;
                                                                                                          possible                                  key
     id                  select type                      table                         type                                       key                     ref    rows   extra
                                                                                                          keys                                      len
     1                   PRIMARY                          <derived2>                     ALL               NULL                     NULL            NULL   NULL   2      Using temporary;
                                                                                                                                                                         Using filesort
     2                   DERIVED                          NULL                           NULL              NULL                     NULL            NULL   NULL   NULL   No tables used
     3                   UNION                            NULL                           NULL              NULL                     NULL            NULL   NULL   NULL   No tables used
     NULL                UNION                            <union2,3>                     ALL               NULL                     NULL            NULL   NULL   NULL   Using temporary
                         RESULT




31       Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: more complex queries
     EXPLAIN
     "query_block": {                                                                                                              "union_result": {
          "ordering_operation": {                                                                                                        "using_temporary_table": true,
          "using_filesort": true,                                                                                                        "table_name": "<union2,3>",
          "grouping_operation": {                                                                                                        "query_specifications": [ {
             "using_temporary_table": true,                                                                                                 "query_block": {
             "using_filesort": false,                                                                                                            "table": {
             "table": {                                                                                                                           "message": "No tables used"
                "table_name": "t1",                                                                                                               } } }, {
                "materialized_from_subquery": {                                                                                             "query_block": {
                  "using_temporary_table": true,                                                                                                 "table": {
                  "query_block": {                                                                                                                "message": "No tables used"
                     … here goes union_result… =>                                                                                                } } } ] } /* union_result */
                  }}}}}}



32    Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: more complex queries
         MySQL Workbench 5.2


 SELECT a, b FROM
 (SELECT 1 AS a, 2 AS b UNION ALL
 SELECT 1 AS a, 2 AS b) t1
 GROUP BY a ORDER BY b DESC;




33   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: subqueries
 mysql> EXPLAIN FORMAT=JSON SELECT derived.vc
 FROM (SELECT * FROM t1) AS derived WHERE
 derived.vc IN (SELECT t2.vc1 FROM t2 JOIN t3 ON t2.vc2=t3.vc);
               select                                                                       possible                                                 key
     id                                       table                             type                                          key                           ref      rows   extra
               type                                                                         keys                                                     len
     1          PRIMARY                        t2                               ALL          NULL                             NULL                   NULL   NULL     2      Using where;
                                                                                                                                                                            Start materialize;
                                                                                                                                                                            Scan
     1          PRIMARY                        t3                               ALL          NULL                             NULL                   NULL   NULL     3      Using where; End
                                                                                                                                                                            materialize; Using
                                                                                                                                                                            join buffer (Block
                                                                                                                                                                            Nested Loop)
     1          PRIMARY                        <derived2>                       ref          <auto_key0>                      <auto_key0>            23     t2.vc1   2      NULL
     2          DERIVED                        t1                               ALL          NULL                             NULL                   NULL   NULL     2      NULL


34       Copyright © 2012, Oracle and/or its affiliates. All rights reserved.    Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: subqueries
     EXPLAIN
     "query_block": {                                                                                                             "table": {
        "select_id": 1,                                                                                                                          "table_name": "derived",
        "nested_loop": [                                                                                                                         "materialized_from_subquery": {
          { "table": {                                                                                                                            "using_temporary_table": true,
                "table_name": "<subquery3>",                                                                                                      "query_block": {
                "materialized_from_subquery": {                                                                                                    "select_id": 2,
                "query_block": {                                                                                                                   "table": {
                     "nested_loop": [                                                                                                                  "table_name": "t1“,
                        { "table": { "table_name": "t2“ } },                                                                                           …
                        { "table": { "table_name": "t3“ } }                                                                                        }
                     ] } /* query_block */ } } /* table */                                                                                        } /* query_block */
          }, { … next table goes here … => }                                                                                                     } /* materialized_from_subquery */
        ] /* nested_loop */ } /* query_block */                                                                                              } /* table */



35    Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: subqueries
         MySQL Workbench 5.2


 SELECT derived.vc
 FROM (SELECT * FROM t1) AS
 derived WHERE
 derived.vc IN (SELECT t2.vc1 FROM
 t2 JOIN t3 ON t2.vc2=t3.vc);




36   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: subqueries
 mysql> EXPLAIN SELECT * FROM t1, t2 WHERE t2.a IN (SELECT a
 FROM t1 WHERE t1.b <> 30) AND t1.b=t2.a GROUP BY t1.a;
                select                                                            possible
     id                                        table            type                                        key            key len                  ref         rows    extra
                type                                                              keys
     1          SIMPLE                         t2               index             a                         a               5                       NULL        4       Using where; Using index;
                                                                                                                                                                        Using temporary; Using filesort
     1          SIMPLE                         t1               ref               a                         a               5                       test.t2.a   101     Using where; Using index; Start
                                                                                                                                                                        temporary; End temporary


     1          SIMPLE                         t1               index             NULL                      a               10                      NULL        10004   Using where; Using index;
                                                                                                                                                                        Using join buffer (Block Nested
                                                                                                                                                                        Loop)




37       Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: subqueries
     EXPLAIN
     "query_block": {                                                                                                             {
        "select_id": 1,                                                                                                               "duplicates_removal": {
        "grouping_operation": {                                                                                                           "using_temporary_table": true,
          "using_temporary_table": true,                                                                                                  "table": {
          "nested_loop": [                                                                                                                   "table_name": "t1",
             {                                                                                                                               "attached_condition": "(`test`.`t1`.`b` <> 30)"
                 "table": {                                                                                                               } /* table */
                  "table_name": "t2",                                                                                                   } /* duplicates_removal */
                  "attached_condition": "(`test`.`t2`.`a` is not null)"                                                               }, {
                 } /* table */                                                                                                          "table": {
             },                                                                                                                           "table_name": "t1",
             … next 2 tables => …                                                                                                         "attached_condition": "(`test`.`t1`.`b` = `test`.`t2`.`a`)"
          ] /* nested_loop */ } /* grouping_operation */                                                                                  } /* table */
     } /* query_block */                                                                                                              }


38    Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: subqueries
         MySQL Workbench 5.2



 SELECT * FROM t1, t2 WHERE t2.a
 IN (SELECT a FROM t1 WHERE t1.b
 <> 30) AND t1.b=t2.a GROUP BY t1.a;




39   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN in JSON: subqueries
     EXPLAIN
     "query_block": {                                                                                                              "query_block": {
        "select_id": 1,                                                                                                               "select_id": 1,
        "nested_loop": [                                                                                                              "nested_loop": [
          {                                                                                                                              {
              "table": {                                                                                                                     "table": {
                "table_name": "t2",                                                                                                              "table_name": "t1",
              } /* table */                                                                                                                      "access_type": "range", "loosescan": true,
          }, {                                                                                                                               } /* table */
              "table": {                                                                                                                 }, {
                "table_name": "t1",                                                                                                          "table": {
                "first_match": "t2",                                                                                                             "table_name": "t2",
                "attached_condition": "(`test`.`t1`.`b` <> 30)"                                                                              } /* table */
              } /* table */                                                                                                              }
     } ] /* nested_loop */ } /* query_block */                                                                                        ] /* nested_loop */ } /* query_block */


40    Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAIN
         for non-select queries




41   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAINing non-select queries
  INSERT/REPLACE and INSERT/REPLACE SELECT
  Single- and multi-table UPDATE
  Single- and multi-table DELETE




42   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAINing non-select queries
 mysql> EXPLAIN UPDATE t1 SET a = 10 WHERE a < 10;
     id          select type                            table                   type            possible keys                               key     key len   ref    rows   extra
     1            SIMPLE                                 t1                     range           a,a_2                                        a      5         NULL   2      Using where;
                                                                                                                                                                            Using
                                                                                                                                                                            temporary




43       Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAINing non-select queries
                                                                                                                                          EXPLAIN
                                                                                                                                            "query_block": {
                                                                                                                                                 "select_id": 1,
                                                                                                                                                 "table": {
                                                                                                                                                  "update": true,
 mysql> EXPLAIN FORMAT=JSON                                                                                                                       "table_name": "t1",
                                                                                                                                                  "access_type": "range",
 UPDATE t1 SET a = 10 WHERE
                                                                                                                                                  "possible_keys": [ "a", "a_2" ],
 a < 10;                                                                                                                                          "key": "a", "key_length": "5",
                                                                                                                                                  "rows": 2, "filtered": 100,
                                                                                                                                                  "using_temporary_table": "for update",
                                                                                                                                                  "attached_condition": "(`test`.`t1`.`a` < 10)"
                                                                                                                                                 } /* table */
                                                                                                                                                } /* query_block */



44   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAINing non-select queries
                                                                                                                                          EXPLAIN
                                                                                                                                            "query_block": {
                                                                                                                                                 "select_id": 1,
                                                                                                                                                 "table": {
                                                                                                                                                  "delete": true,
 mysql> EXPLAIN FORMAT=JSON                                                                                                                       "table_name": "t1",
                                                                                                                                                  "access_type": "range",
 DELETE FROM t1 WHERE a < 10;
                                                                                                                                                  "possible_keys": [ "a", "a_2“ ],
                                                                                                                                                  "key": "a", "key_length": "5",
                                                                                                                                                  "rows": 2, "filtered": 100,
                                                                                                                                                  "attached_condition": "(`test`.`t1`.`a` < 10)"
                                                                                                                                                 } /* table */
                                                                                                                                                } /* query_block */




45   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAINing non-select queries
 mysql> EXPLAIN UPDATE t1 t11, (SELECT * FROM t2) t12 SET t11.a =10
 WHERE t11.a = 1;
                select                                                                         possible
     id                                        table                            type                                      key                key len   ref     rows   extra
                type                                                                           keys
     1          PRIMARY                        t11                              ref             a,a_2                      a                  5        const   1      NULL

     1          PRIMARY                        <derived2>                       ALL             NULL                       NULL               NULL     NULL    3      Using join buffer (Block
                                                                                                                                                                      Nested Loop)
     2          DERIVED                        t2                               ALL             NULL                       NULL               NULL     NULL    3      NULL




46       Copyright © 2012, Oracle and/or its affiliates. All rights reserved.    Insert Information Protection Policy Classification from Slide 12
EXPLAINing non-select queries
     EXPLAIN
      "query_block": {                                                                                                                   {
        "select_id": 1,                                                                                                                      "table": {
        "nested_loop": [ {                                                                                                                       "table_name": "t12",
             "table": {                                                                                                                          "access_type": "ALL",
                "update": true,                                                                                                                  "rows": 3, "filtered": 100,
                "table_name": "t11",                                                                                                             "using_join_buffer": "Block Nested Loop",
                "access_type": "ref",                                                                                                            "materialized_from_subquery": {
                "possible_keys": [ "a", "a_2“ ],                                                                                                  "using_temporary_table": true,
                "key": "a", "key_length": "5",                                                                                                    "query_block": {
                "ref": ["const"] /* ref */,                                                                                                        "select_id": 2,
                "rows": 1, "filtered": 100                                                                                                         "table": { … } /* table */
             } /* table */ },                                                                                                                     } /* query_block */
          … here goes                  2nd    table…=>                                                                                           } /* materialized_from_subquery */
        ] /* nested_loop */ } /* query_block */                                                                                              } /* table */ }


47    Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAINing non-select queries
 mysql> EXPLAIN UPDATE t1 SET a = 10 WHERE a IN
 (SELECT a FROM t2);
     id                  select type                         table              type              possible keys                         key         key len          ref   rows   extra
     1                   PRIMARY                              t1                ALL                a,a_2                                 NULL       NULL      NULL         3      NULL

     1                   DEPENDENT                            t2                ALL                NULL                                  NULL       NULL      NULL         3      Using where
                         SUBQUERY




48       Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
EXPLAINing non-select queries
     EXPLAIN
     "query_block": {                                                                                                              [{
        "select_id": 1,                                                                                                                          "dependent": true, "cacheable": false,
        "table": {                                                                                                                               "query_block": {
          "update": true,                                                                                                                         "select_id": 2,
          "table_name": "t1",                                                                                                                     "table": {
          "possible_keys": [ "a", "a_2“ ],                                                                                                         "table_name": "t2",
          "attached_condition":                                                                                                                    "access_type": "ALL",
             "<in_optimizer>(`test`.`t1`.`a`,                                                                                                      "rows": 3, "filtered": 100,
              <exists>(select 1 from `test`.`t2` where                                                                                             "attached_condition":
                                (<cache>(`test`.`t1`.`a`) =                                                                                          "(<cache>(`test`.`t1`.`a`) = `test`.`t2`.`b`)"
                                  `test`.`t1`.`a`)))",                                                                                            } /* table */
            "attached_subqueries": [ … => …]                                                                                                     } /* query_block */
         } /* table */                                                                                                                  }]
      } /* query_block */


49    Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12
50   Copyright © 2012, Oracle and/or its affiliates. All rights reserved.   Insert Information Protection Policy Classification from Slide 12

Weitere ähnliche Inhalte

Was ist angesagt?

Myth busters - performance tuning 101 2007
Myth busters - performance tuning 101 2007Myth busters - performance tuning 101 2007
Myth busters - performance tuning 101 2007paulguerin
 
MySQL Query And Index Tuning
MySQL Query And Index TuningMySQL Query And Index Tuning
MySQL Query And Index TuningManikanda kumar
 
Troubleshooting MySQL Performance add-ons
Troubleshooting MySQL Performance add-onsTroubleshooting MySQL Performance add-ons
Troubleshooting MySQL Performance add-onsSveta Smirnova
 
Understanding Query Execution
Understanding Query ExecutionUnderstanding Query Execution
Understanding Query Executionwebhostingguy
 
56 Query Optimization
56 Query Optimization56 Query Optimization
56 Query OptimizationMYXPLAIN
 
Nested Queries Lecture
Nested Queries LectureNested Queries Lecture
Nested Queries LectureFelipe Costa
 
Database development coding standards
Database development coding standardsDatabase development coding standards
Database development coding standardsAlessandro Baratella
 
MySQL Replication Evolution -- Confoo Montreal 2017
MySQL Replication Evolution -- Confoo Montreal 2017MySQL Replication Evolution -- Confoo Montreal 2017
MySQL Replication Evolution -- Confoo Montreal 2017Dave Stokes
 
SQLAlchemy Core: An Introduction
SQLAlchemy Core: An IntroductionSQLAlchemy Core: An Introduction
SQLAlchemy Core: An IntroductionJason Myers
 
Optimizing Queries with Explain
Optimizing Queries with ExplainOptimizing Queries with Explain
Optimizing Queries with ExplainMYXPLAIN
 
An introduction to SQLAlchemy
An introduction to SQLAlchemyAn introduction to SQLAlchemy
An introduction to SQLAlchemymengukagan
 
DBMS lab manual
DBMS lab manualDBMS lab manual
DBMS lab manualmaha tce
 
PL/SQL User-Defined Functions in the Read World
PL/SQL User-Defined Functions in the Read WorldPL/SQL User-Defined Functions in the Read World
PL/SQL User-Defined Functions in the Read WorldMichael Rosenblum
 

Was ist angesagt? (19)

Myth busters - performance tuning 101 2007
Myth busters - performance tuning 101 2007Myth busters - performance tuning 101 2007
Myth busters - performance tuning 101 2007
 
MySQL Query And Index Tuning
MySQL Query And Index TuningMySQL Query And Index Tuning
MySQL Query And Index Tuning
 
Best sql plsql material
Best sql plsql materialBest sql plsql material
Best sql plsql material
 
Troubleshooting MySQL Performance add-ons
Troubleshooting MySQL Performance add-onsTroubleshooting MySQL Performance add-ons
Troubleshooting MySQL Performance add-ons
 
Understanding Query Execution
Understanding Query ExecutionUnderstanding Query Execution
Understanding Query Execution
 
56 Query Optimization
56 Query Optimization56 Query Optimization
56 Query Optimization
 
Nested Queries Lecture
Nested Queries LectureNested Queries Lecture
Nested Queries Lecture
 
Database development coding standards
Database development coding standardsDatabase development coding standards
Database development coding standards
 
Mysql cheatsheet
Mysql cheatsheetMysql cheatsheet
Mysql cheatsheet
 
Lab1 select statement
Lab1 select statementLab1 select statement
Lab1 select statement
 
View & index in SQL
View & index in SQLView & index in SQL
View & index in SQL
 
Php 26
Php 26Php 26
Php 26
 
MySQL Replication Evolution -- Confoo Montreal 2017
MySQL Replication Evolution -- Confoo Montreal 2017MySQL Replication Evolution -- Confoo Montreal 2017
MySQL Replication Evolution -- Confoo Montreal 2017
 
SQLAlchemy Core: An Introduction
SQLAlchemy Core: An IntroductionSQLAlchemy Core: An Introduction
SQLAlchemy Core: An Introduction
 
Optimizing Queries with Explain
Optimizing Queries with ExplainOptimizing Queries with Explain
Optimizing Queries with Explain
 
An introduction to SQLAlchemy
An introduction to SQLAlchemyAn introduction to SQLAlchemy
An introduction to SQLAlchemy
 
DBMS lab manual
DBMS lab manualDBMS lab manual
DBMS lab manual
 
PL/SQL User-Defined Functions in the Read World
PL/SQL User-Defined Functions in the Read WorldPL/SQL User-Defined Functions in the Read World
PL/SQL User-Defined Functions in the Read World
 
Recursive Query Throwdown
Recursive Query ThrowdownRecursive Query Throwdown
Recursive Query Throwdown
 

Andere mochten auch

Inno db internals innodb file formats and source code structure
Inno db internals innodb file formats and source code structureInno db internals innodb file formats and source code structure
Inno db internals innodb file formats and source code structurezhaolinjnu
 
The nightmare of locking, blocking and isolation levels!
The nightmare of locking, blocking and isolation levels!The nightmare of locking, blocking and isolation levels!
The nightmare of locking, blocking and isolation levels!Boris Hristov
 
MySQL 5.7: Focus on InnoDB
MySQL 5.7: Focus on InnoDBMySQL 5.7: Focus on InnoDB
MySQL 5.7: Focus on InnoDBMario Beck
 
Mvcc Unmasked (Bruce Momjian)
Mvcc Unmasked (Bruce Momjian)Mvcc Unmasked (Bruce Momjian)
Mvcc Unmasked (Bruce Momjian)Ontico
 
The Power of MySQL Explain
The Power of MySQL ExplainThe Power of MySQL Explain
The Power of MySQL ExplainMYXPLAIN
 
Mv unmasked.w.code.march.2013
Mv unmasked.w.code.march.2013Mv unmasked.w.code.march.2013
Mv unmasked.w.code.march.2013EDB
 
Como migrar una base de datos de mysql a power designer
Como migrar una base de datos de mysql a power designerComo migrar una base de datos de mysql a power designer
Como migrar una base de datos de mysql a power designerAlex Bernal
 
A brief introduction to PostgreSQL
A brief introduction to PostgreSQLA brief introduction to PostgreSQL
A brief introduction to PostgreSQLVu Hung Nguyen
 
Postgres MVCC - A Developer Centric View of Multi Version Concurrency Control
Postgres MVCC - A Developer Centric View of Multi Version Concurrency ControlPostgres MVCC - A Developer Centric View of Multi Version Concurrency Control
Postgres MVCC - A Developer Centric View of Multi Version Concurrency ControlReactive.IO
 
InnoDB Internal
InnoDB InternalInnoDB Internal
InnoDB Internalmysqlops
 
MySQL EXPLAIN Explained-Norvald H. Ryeng
MySQL EXPLAIN Explained-Norvald H. RyengMySQL EXPLAIN Explained-Norvald H. Ryeng
MySQL EXPLAIN Explained-Norvald H. Ryeng郁萍 王
 
SQL Transactions - What they are good for and how they work
SQL Transactions - What they are good for and how they workSQL Transactions - What they are good for and how they work
SQL Transactions - What they are good for and how they workMarkus Winand
 
Best practices for MySQL High Availability
Best practices for MySQL High AvailabilityBest practices for MySQL High Availability
Best practices for MySQL High AvailabilityColin Charles
 
MySQL High Availability Solutions - Feb 2015 webinar
MySQL High Availability Solutions - Feb 2015 webinarMySQL High Availability Solutions - Feb 2015 webinar
MySQL High Availability Solutions - Feb 2015 webinarAndrew Morgan
 
Kenneth Smith Resume 2015
Kenneth Smith Resume 2015Kenneth Smith Resume 2015
Kenneth Smith Resume 2015Kenneth Smith
 

Andere mochten auch (20)

Inno db internals innodb file formats and source code structure
Inno db internals innodb file formats and source code structureInno db internals innodb file formats and source code structure
Inno db internals innodb file formats and source code structure
 
The nightmare of locking, blocking and isolation levels!
The nightmare of locking, blocking and isolation levels!The nightmare of locking, blocking and isolation levels!
The nightmare of locking, blocking and isolation levels!
 
MySQL 5.7: Focus on InnoDB
MySQL 5.7: Focus on InnoDBMySQL 5.7: Focus on InnoDB
MySQL 5.7: Focus on InnoDB
 
Mvcc Unmasked (Bruce Momjian)
Mvcc Unmasked (Bruce Momjian)Mvcc Unmasked (Bruce Momjian)
Mvcc Unmasked (Bruce Momjian)
 
Mysql For Developers
Mysql For DevelopersMysql For Developers
Mysql For Developers
 
The Power of MySQL Explain
The Power of MySQL ExplainThe Power of MySQL Explain
The Power of MySQL Explain
 
Mv unmasked.w.code.march.2013
Mv unmasked.w.code.march.2013Mv unmasked.w.code.march.2013
Mv unmasked.w.code.march.2013
 
Como migrar una base de datos de mysql a power designer
Como migrar una base de datos de mysql a power designerComo migrar una base de datos de mysql a power designer
Como migrar una base de datos de mysql a power designer
 
Explain
ExplainExplain
Explain
 
A brief introduction to PostgreSQL
A brief introduction to PostgreSQLA brief introduction to PostgreSQL
A brief introduction to PostgreSQL
 
Postgres MVCC - A Developer Centric View of Multi Version Concurrency Control
Postgres MVCC - A Developer Centric View of Multi Version Concurrency ControlPostgres MVCC - A Developer Centric View of Multi Version Concurrency Control
Postgres MVCC - A Developer Centric View of Multi Version Concurrency Control
 
InnoDB Internal
InnoDB InternalInnoDB Internal
InnoDB Internal
 
MySQL EXPLAIN Explained-Norvald H. Ryeng
MySQL EXPLAIN Explained-Norvald H. RyengMySQL EXPLAIN Explained-Norvald H. Ryeng
MySQL EXPLAIN Explained-Norvald H. Ryeng
 
SQL Transactions - What they are good for and how they work
SQL Transactions - What they are good for and how they workSQL Transactions - What they are good for and how they work
SQL Transactions - What they are good for and how they work
 
Best practices for MySQL High Availability
Best practices for MySQL High AvailabilityBest practices for MySQL High Availability
Best practices for MySQL High Availability
 
Introduction to MySQL
Introduction to MySQLIntroduction to MySQL
Introduction to MySQL
 
MySQL High Availability Solutions - Feb 2015 webinar
MySQL High Availability Solutions - Feb 2015 webinarMySQL High Availability Solutions - Feb 2015 webinar
MySQL High Availability Solutions - Feb 2015 webinar
 
Introduction to Mysql
Introduction to MysqlIntroduction to Mysql
Introduction to Mysql
 
i.materialise
i.materialisei.materialise
i.materialise
 
Kenneth Smith Resume 2015
Kenneth Smith Resume 2015Kenneth Smith Resume 2015
Kenneth Smith Resume 2015
 

Ähnlich wie Powerful Explain in MySQL 5.6

Mastering Spring Boot's Actuator with Madhura Bhave
Mastering Spring Boot's Actuator with Madhura BhaveMastering Spring Boot's Actuator with Madhura Bhave
Mastering Spring Boot's Actuator with Madhura BhaveVMware Tanzu
 
Es part 2 pdf no build
Es part 2 pdf no buildEs part 2 pdf no build
Es part 2 pdf no buildErik Rose
 
JSON array indexes in MySQL
JSON array indexes in MySQLJSON array indexes in MySQL
JSON array indexes in MySQLDag H. Wanvik
 
Couchbase N1QL: Index Advisor
Couchbase N1QL: Index AdvisorCouchbase N1QL: Index Advisor
Couchbase N1QL: Index AdvisorKeshav Murthy
 
MongoDB Performance Tuning
MongoDB Performance TuningMongoDB Performance Tuning
MongoDB Performance TuningMongoDB
 
Zero to Sixty: AWS CloudFormation (DMG201) | AWS re:Invent 2013
Zero to Sixty: AWS CloudFormation (DMG201) | AWS re:Invent 2013Zero to Sixty: AWS CloudFormation (DMG201) | AWS re:Invent 2013
Zero to Sixty: AWS CloudFormation (DMG201) | AWS re:Invent 2013Amazon Web Services
 
Postman Collection Format v2.0 (pre-draft)
Postman Collection Format v2.0 (pre-draft)Postman Collection Format v2.0 (pre-draft)
Postman Collection Format v2.0 (pre-draft)Postman
 
Services Drupalcamp Stockholm 2009
Services Drupalcamp Stockholm 2009Services Drupalcamp Stockholm 2009
Services Drupalcamp Stockholm 2009hugowetterberg
 
ELK Stack - Turn boring logfiles into sexy dashboard
ELK Stack - Turn boring logfiles into sexy dashboardELK Stack - Turn boring logfiles into sexy dashboard
ELK Stack - Turn boring logfiles into sexy dashboardGeorg Sorst
 
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017Codemotion
 
Integrating SAP the Java EE Way - JBoss One Day talk 2012
Integrating SAP the Java EE Way - JBoss One Day talk 2012Integrating SAP the Java EE Way - JBoss One Day talk 2012
Integrating SAP the Java EE Way - JBoss One Day talk 2012hwilming
 
Optimizer Trace Walkthrough
Optimizer Trace WalkthroughOptimizer Trace Walkthrough
Optimizer Trace WalkthroughSergey Petrunya
 
Using Spark to Load Oracle Data into Cassandra
Using Spark to Load Oracle Data into CassandraUsing Spark to Load Oracle Data into Cassandra
Using Spark to Load Oracle Data into CassandraJim Hatcher
 
Using Spark to Load Oracle Data into Cassandra (Jim Hatcher, IHS Markit) | C*...
Using Spark to Load Oracle Data into Cassandra (Jim Hatcher, IHS Markit) | C*...Using Spark to Load Oracle Data into Cassandra (Jim Hatcher, IHS Markit) | C*...
Using Spark to Load Oracle Data into Cassandra (Jim Hatcher, IHS Markit) | C*...DataStax
 
Service discovery and configuration provisioning
Service discovery and configuration provisioningService discovery and configuration provisioning
Service discovery and configuration provisioningSource Ministry
 
First Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven DevelopmentFirst Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven DevelopmentNuvole
 

Ähnlich wie Powerful Explain in MySQL 5.6 (20)

Mastering Spring Boot's Actuator with Madhura Bhave
Mastering Spring Boot's Actuator with Madhura BhaveMastering Spring Boot's Actuator with Madhura Bhave
Mastering Spring Boot's Actuator with Madhura Bhave
 
MongoDB and RDBMS
MongoDB and RDBMSMongoDB and RDBMS
MongoDB and RDBMS
 
Es part 2 pdf no build
Es part 2 pdf no buildEs part 2 pdf no build
Es part 2 pdf no build
 
JSON array indexes in MySQL
JSON array indexes in MySQLJSON array indexes in MySQL
JSON array indexes in MySQL
 
Couchbase N1QL: Index Advisor
Couchbase N1QL: Index AdvisorCouchbase N1QL: Index Advisor
Couchbase N1QL: Index Advisor
 
MongoDB Performance Tuning
MongoDB Performance TuningMongoDB Performance Tuning
MongoDB Performance Tuning
 
Specs2
Specs2Specs2
Specs2
 
Zero to Sixty: AWS CloudFormation (DMG201) | AWS re:Invent 2013
Zero to Sixty: AWS CloudFormation (DMG201) | AWS re:Invent 2013Zero to Sixty: AWS CloudFormation (DMG201) | AWS re:Invent 2013
Zero to Sixty: AWS CloudFormation (DMG201) | AWS re:Invent 2013
 
Postman Collection Format v2.0 (pre-draft)
Postman Collection Format v2.0 (pre-draft)Postman Collection Format v2.0 (pre-draft)
Postman Collection Format v2.0 (pre-draft)
 
Services Drupalcamp Stockholm 2009
Services Drupalcamp Stockholm 2009Services Drupalcamp Stockholm 2009
Services Drupalcamp Stockholm 2009
 
ELK Stack - Turn boring logfiles into sexy dashboard
ELK Stack - Turn boring logfiles into sexy dashboardELK Stack - Turn boring logfiles into sexy dashboard
ELK Stack - Turn boring logfiles into sexy dashboard
 
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
 
Creating Alloy Widgets
Creating Alloy WidgetsCreating Alloy Widgets
Creating Alloy Widgets
 
Integrating SAP the Java EE Way - JBoss One Day talk 2012
Integrating SAP the Java EE Way - JBoss One Day talk 2012Integrating SAP the Java EE Way - JBoss One Day talk 2012
Integrating SAP the Java EE Way - JBoss One Day talk 2012
 
Optimizer Trace Walkthrough
Optimizer Trace WalkthroughOptimizer Trace Walkthrough
Optimizer Trace Walkthrough
 
Using Spark to Load Oracle Data into Cassandra
Using Spark to Load Oracle Data into CassandraUsing Spark to Load Oracle Data into Cassandra
Using Spark to Load Oracle Data into Cassandra
 
Using Spark to Load Oracle Data into Cassandra (Jim Hatcher, IHS Markit) | C*...
Using Spark to Load Oracle Data into Cassandra (Jim Hatcher, IHS Markit) | C*...Using Spark to Load Oracle Data into Cassandra (Jim Hatcher, IHS Markit) | C*...
Using Spark to Load Oracle Data into Cassandra (Jim Hatcher, IHS Markit) | C*...
 
Mug17 gurgaon
Mug17 gurgaonMug17 gurgaon
Mug17 gurgaon
 
Service discovery and configuration provisioning
Service discovery and configuration provisioningService discovery and configuration provisioning
Service discovery and configuration provisioning
 
First Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven DevelopmentFirst Steps in Drupal Code Driven Development
First Steps in Drupal Code Driven Development
 

Mehr von MYXPLAIN

Query Optimization with MySQL 5.6: Old and New Tricks
Query Optimization with MySQL 5.6: Old and New TricksQuery Optimization with MySQL 5.6: Old and New Tricks
Query Optimization with MySQL 5.6: Old and New TricksMYXPLAIN
 
Need for Speed: MySQL Indexing
Need for Speed: MySQL IndexingNeed for Speed: MySQL Indexing
Need for Speed: MySQL IndexingMYXPLAIN
 
Advanced Query Optimizer Tuning and Analysis
Advanced Query Optimizer Tuning and AnalysisAdvanced Query Optimizer Tuning and Analysis
Advanced Query Optimizer Tuning and AnalysisMYXPLAIN
 
MySQL Index Cookbook
MySQL Index CookbookMySQL Index Cookbook
MySQL Index CookbookMYXPLAIN
 
Advanced MySQL Query and Schema Tuning
Advanced MySQL Query and Schema TuningAdvanced MySQL Query and Schema Tuning
Advanced MySQL Query and Schema TuningMYXPLAIN
 
Are You Getting the Best of your MySQL Indexes
Are You Getting the Best of your MySQL IndexesAre You Getting the Best of your MySQL Indexes
Are You Getting the Best of your MySQL IndexesMYXPLAIN
 
How to Design Indexes, Really
How to Design Indexes, ReallyHow to Design Indexes, Really
How to Design Indexes, ReallyMYXPLAIN
 
MySQL 5.6 Performance
MySQL 5.6 PerformanceMySQL 5.6 Performance
MySQL 5.6 PerformanceMYXPLAIN
 
MySQL Indexing - Best practices for MySQL 5.6
MySQL Indexing - Best practices for MySQL 5.6MySQL Indexing - Best practices for MySQL 5.6
MySQL Indexing - Best practices for MySQL 5.6MYXPLAIN
 
Tools and Techniques for Index Design
Tools and Techniques for Index DesignTools and Techniques for Index Design
Tools and Techniques for Index DesignMYXPLAIN
 
Improving Performance with Better Indexes
Improving Performance with Better IndexesImproving Performance with Better Indexes
Improving Performance with Better IndexesMYXPLAIN
 
Covering indexes
Covering indexesCovering indexes
Covering indexesMYXPLAIN
 
MySQL Optimizer Overview
MySQL Optimizer OverviewMySQL Optimizer Overview
MySQL Optimizer OverviewMYXPLAIN
 
Advanced query optimization
Advanced query optimizationAdvanced query optimization
Advanced query optimizationMYXPLAIN
 

Mehr von MYXPLAIN (14)

Query Optimization with MySQL 5.6: Old and New Tricks
Query Optimization with MySQL 5.6: Old and New TricksQuery Optimization with MySQL 5.6: Old and New Tricks
Query Optimization with MySQL 5.6: Old and New Tricks
 
Need for Speed: MySQL Indexing
Need for Speed: MySQL IndexingNeed for Speed: MySQL Indexing
Need for Speed: MySQL Indexing
 
Advanced Query Optimizer Tuning and Analysis
Advanced Query Optimizer Tuning and AnalysisAdvanced Query Optimizer Tuning and Analysis
Advanced Query Optimizer Tuning and Analysis
 
MySQL Index Cookbook
MySQL Index CookbookMySQL Index Cookbook
MySQL Index Cookbook
 
Advanced MySQL Query and Schema Tuning
Advanced MySQL Query and Schema TuningAdvanced MySQL Query and Schema Tuning
Advanced MySQL Query and Schema Tuning
 
Are You Getting the Best of your MySQL Indexes
Are You Getting the Best of your MySQL IndexesAre You Getting the Best of your MySQL Indexes
Are You Getting the Best of your MySQL Indexes
 
How to Design Indexes, Really
How to Design Indexes, ReallyHow to Design Indexes, Really
How to Design Indexes, Really
 
MySQL 5.6 Performance
MySQL 5.6 PerformanceMySQL 5.6 Performance
MySQL 5.6 Performance
 
MySQL Indexing - Best practices for MySQL 5.6
MySQL Indexing - Best practices for MySQL 5.6MySQL Indexing - Best practices for MySQL 5.6
MySQL Indexing - Best practices for MySQL 5.6
 
Tools and Techniques for Index Design
Tools and Techniques for Index DesignTools and Techniques for Index Design
Tools and Techniques for Index Design
 
Improving Performance with Better Indexes
Improving Performance with Better IndexesImproving Performance with Better Indexes
Improving Performance with Better Indexes
 
Covering indexes
Covering indexesCovering indexes
Covering indexes
 
MySQL Optimizer Overview
MySQL Optimizer OverviewMySQL Optimizer Overview
MySQL Optimizer Overview
 
Advanced query optimization
Advanced query optimizationAdvanced query optimization
Advanced query optimization
 

Kürzlich hochgeladen

Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 

Kürzlich hochgeladen (20)

Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 

Powerful Explain in MySQL 5.6

  • 1. 1 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 2. Powerful EXPLAIN in MySQL 5.6 Evgeny Potemkin MySQL Optimizer team 2 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 3. Program Agenda  Introduction  Optimizer trace  EXPLAIN in JSON format  Explaining INSERT, UPDATE, DELETE 3 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 4. Graphic Section Divider 4 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 5. Optimizer Trace 5 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 6. Optimizer trace: quick start mysql> SET optimizer_trace= “enabled=on“, end_markers_in_json=on; mysql> SELECT * FROM orders WHERE customer_id <> 6; mysql> SELECT trace FROM information_schema.OPTIMIZER_TRACE; mysql> SET optimizer_trace="enabled=off"; QUERY SELECT * FROM orders WHERE customer_id <> 6 TRACE “steps”: [ { "join_preparation": { "select#": 1,… } … } …] MISSING_BYTES_BEYOND_MAX_MEM_SIZE 0 INSUFFICIENT_PRIVILEGES 0 6 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 7. Optimizer trace: what’s inside  Steps – Join preparation  Modifications to subquery  Expanded query – Join optimization  Range optimizer info  Plan generation process  Condition optimization  Processing of ORDER/GROUP BY – Join execution  Tmp tables related info 7 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 8. Optimizer trace: example mysql> SET optimizer_trace="enabled=on"; mysql> SELECT * FROM t1,t2 WHERE f1=1 AND f1=f2 AND f2>0; mysql> SELECT trace FROM information_schema.optimizer_trace; mysql> SET optimizer_trace="enabled=off"; 8 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 9. Optimizer trace: example join_optimization / steps / condition_processing "condition": "WHERE", "original_condition": "((`t1`.`f1` = 1) and (`t1`.`f1` = `t2`.`f2`) and (`t2`.`f2` > 0))", "steps": [ { "transformation": "equality_propagation", "resulting_condition": "((`t2`.`f2` > 0) and multiple equal(1, `t1`.`f1`, `t2`.`f2`))" }, { "transformation": "constant_propagation", "resulting_condition": "((1 > 0) and multiple equal(1, `t1`.`f1`, `t2`.`f2`))" }, { "transformation": "trivial_condition_removal", "resulting_condition": "multiple equal(1, `t1`.`f1`, `t2`.`f2`)" } ] /* steps */ 9 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 10. Optimizer trace: example join_optimization / row_estimation / table : t1, range_analysis "table_scan": { "analyzing_range_alternatives": { "rows": 5, "range_scan_alternatives": [ { "cost": 5.1085 "index": "f1", } /* table_scan */, "ranges": [ "1 <= f1 <= 1“ ] /* ranges */, "potential_range_indices": [ { "index_dives_for_eq_ranges": true, "index": "f1", "usable": true, "rows": 2, "cost": 3.41, "key_parts": [ "f1“ ] /* key_parts */ } "chosen": false, ] /* potential_range_indices */, "cause": "cost" "best_covering_index_scan": { } "index": "f1", "cost": 2.093, "chosen": true ] /* range_scan_alternatives */, } /* best_covering_index_scan */, "analyzing_roworder_intersect": { "group_index_range": { "usable": false, "cause": "too_few_roworder_scans" "chosen": false, "cause": "not_single_table" } /* analyzing_roworder_intersect */ } /* group_index_range */, } /* analyzing_range_alternatives */ 10 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 11. Optimizer trace: example join_optimization / considered_execution_plan "plan_prefix": [ ] /* plan_prefix */, "plan_prefix": [ "`t2`“ ] /* plan_prefix */, "table": "`t2`", "table": "`t1`", "best_access_path": { "best_access_path": { "considered_access_paths": [ { "considered_access_paths": [ { "access_type": "scan", "rows": 3, "access_type": "ref", "index": "f1", "cost": 2.6051, "chosen": true "rows": 2, "cost": 3.4698, "chosen": true } ] /* considered_access_paths */ }, { } /* best_access_path */, "access_type": "scan", "using_join_cache": true, "cost_for_plan": 2.6051, "rows": 2, "cost": 3.8087, "rows_for_plan": 3, "chosen": true "rest_of_plan": [ { } ] } /* best_access_path */, … next iteration … => "cost_for_plan": 6.4138, } ] /* rest_of_plan */ "rows_for_plan": 6, "chosen": true 11 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 12. Optimizer trace: example join_optimization / plan refinement { { "attaching_conditions_to_tables": { "refine_plan": [ "original_condition": { "((`t1`.`f1` = 1) and (`t2`.`f2` = 1))", "table": "`t1`" "attached_conditions_summary": [ { }, "table": "`t1`", "attached": null { }, { "table": "`t2`", "table": "`t2`", "attached": "(`t2`.`f2` = 1)" "access_type": "table_scan" } } ] /* attached_conditions_summary */ ] /* refine_plan */ } /* attaching_conditions_to_tables */ } }, 12 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 13. Optimizer trace: controls  optimizer-trace  optimizer-trace-features – greedy_search – range_optimizer – dynamic_range – repeated_subselect  optimizer-trace-limit  optimizer-trace-offset  optimizer-trace-max-mem-size  end-markers-in-json 13 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 14. Optimizer trace: exploring  mysql> pager less  SELECT TRACE INTO DUMPFILE <filename> FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;  JSONView for Firefox  Pretty JSON for Chrome  A registry patch for IE 14 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 15. EXPLAIN in JSON format 15 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 16. Traditional EXPLAIN id select type table type possible key key len ref rows extra keys 1 PRIMARY cust index cust_id, cust_name 40 const 10 Using where; Start cust_name materialize; Scan 1 PRIMARY orders ref order_id order_id 8 ordid 32 Using where; End materialize; Using join buffer (Block Nested Loop) 1 PRIMARY <derived2> ref <auto_key0> <auto_key0> 23 vc1 100 Using index 2 DERIVED flights ALL NULL NULL NULL NULL 10000 Using where; Start materialize; Scan 2 DERIVED storage eq_ref PRIMARY PRIMARY 8 fl_store 1 Using where; End materialize; Using join buffer (Block Nested Loop) 4 SUBQUERY buzz range buzzez buzzez 11 NULL 42 Using index; Using where 6 SUBQUERY shortage index shrt_idx shrt_idx 100 NULL 243 Using index; Using where 16 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 17. Traditional EXPLAIN: Cons  Hard to read in complex cases  Unclear/non-obvious query structure in complex cases – Could take quite some time to see what’s going on  Limited information about query plan – How conditions are split? When a subquery is evaluated?  Hard to impossible to extend – Indication of a feature being used usually is limited to “Using <something>” 17 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 18. EXPLAIN in JSON: Basics mysql> EXPLAIN SELECT * FROM t1; id select type table type possible keys key key len ref rows extra 1 SIMPLE t1 index NULL i 5 NULL 3 NULL 18 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 19. EXPLAIN in JSON: Basics EXPLAIN "query_block": { "select_id": 1, "table": { "table_name": "t1", mysql> EXPLAIN FORMAT=JSON "access_type": "index", SELECT * FROM t1; "key": "i", "key_length": "5", "rows": 3, "filtered": 100, "using_index": true } /* table */ } /* query_block */ 19 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 20. EXPLAIN in JSON: Basics mysql> set end_markers_in_json = on; end_markers_in_json = off end_markers_in_json = on } } /* table */ } } /* query_block */ } } ] ] /* query_specifications */ } } /* union_result */ } } /* query_block */ } } /* materialized_from_subquery */ } } /* table */ } } /* grouping_operation */ } } /* ordering_operation */ } } /* query_block */ 20 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 21. EXPLAIN in JSON: Basics mysql> EXPLAIN SELECT * FROM t1 WHERE str IS NULL AND id > 0; id select type table type possible keys key key len ref rows extra 1 SIMPLE t1 ref str str 11 const 1 Using index condition; Using where 21 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 22. EXPLAIN in JSON: Basics EXPLAIN "query_block": { "select_id": 1, "table": { "table_name": "t1", mysql> EXPLAIN FORMAT=JSON "access_type": "ref", SELECT * FROM t1 WHERE str IS "possible_keys": [ "str“ ], "key": "str", "key_length": "11", NULL AND id > 0; "ref": [ "const"], "rows": 1, "filtered": 100, "index_condition": "isnull(`test`.`t1`.`str`)“ "attached_condition": "(`test`.`t1`.`id` > 0)" } /* table */ } /* query_block */ 22 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 23. EXPLAIN in JSON: Basics mysql> EXPLAIN PARTITIONS SELECT * FROM t1 WHERE a BETWEEN '0000-00-00' AND '1001-01-01'; possible key id select type partitions table type key ref rows extra keys len 1 SIMPLE pNULL, t1 index a a 4 NULL 6 Using where; p0001-01-01, Using index p1001-01-01 23 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 24. EXPLAIN in JSON: Basics EXPLAIN "query_block": { "select_id": 1, "table": { "table_name": "t1", mysql> EXPLAIN FORMAT=JSON "partitions": [ "pNULL", "p0001-01-01", SELECT * FROM t1 WHERE a "p1001-01-01"], "access_type": "index", BETWEEN '0000-00-00' AND '1001- "possible_keys": [ "a" ], 01-01'; "key": "a", "key_length": "4", "rows": 6, "filtered": 33.333, "using_index": true, "attached_condition": "(`test`.`t1`.`a` between '0000-00-00' and '1001-01-01')" }} 24 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 25. EXPLAIN in JSON: Basics mysql> EXPLAIN SELECT * FROM t1 JOIN t2 USING(i); possible key id select type table type key ref rows extra keys len 1 SIMPLE t2 ALL NULL NULL NULL NULL 3 NULL 1 SIMPLE t1 index i i 5 NULL 3 Using where; Using index; Using join buffer (Block Nested Loop) 25 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 26. EXPLAIN in JSON: Basics EXPLAIN { { "query_block": { "table": { "select_id": 1, "table_name": "t1", "nested_loop": [ "access_type": "index", { "possible_keys": [ "i" ], "table": { "key": "i", "key_length": "5", "table_name": "t2", "rows": 3, "filtered": 100, "access_type": "ALL", "using_index": true, "rows": 3, "using_join_buffer": "Block Nested Loop", "filtered": 100 "attached_condition": } /* table */ "(`test`.`t1`.`i` = `test`.`t2`.`i`)" }, } /* table */ … next table … => } ] } /* nested_loop */ } /* query_block */ 26 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 27. EXPLAIN in JSON: Basics MySQL Workbench 5.2 SELECT * FROM t1 JOIN t2 USING(i); 27 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 28. EXPLAIN in JSON: more complex queries mysql> EXPLAIN FORMAT=JSON SELECT t1.a, MIN(t2.b) FROM t1 LEFT JOIN t2 ON t1.a=t2.a GROUP BY t1.a ORDER BY t1.b; id select type table type possible keys key key len ref rows extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using temporary; Using filesort 1 SIMPLE t2 ref PRIMARY PRIMARY 4 test.t1.a 1 Using index 28 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 29. EXPLAIN in JSON: more complex queries EXPLAIN "query_block": { mysql> EXPLAIN FORMAT=JSON "select_id": 1, SELECT t1.a, MIN(t2.b) "ordering_operation": { "using_temporary_table": true, FROM t1 LEFT JOIN t2 "using_filesort": true, "grouping_operation": { ON t1.a=t2.a "using_filesort": true, GROUP BY t1.a ORDER BY t1.b; "nested_loop": [ { “table” : {…} }, { “table” : {…} } ] /* nested_loop */ } /* grouping_operation */ } /* ordering_operation */ } /* query_block */ 29 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 30. EXPLAIN in JSON: more complex queries MySQL Workbench 5.2 SELECT t1.a, MIN(t2.b) FROM t1 LEFT JOIN t2 ON t1.a=t2.a GROUP BY t1.a ORDER BY t1.b; 30 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 31. EXPLAIN in JSON: more complex queries mysql> EXPLAIN SELECT a, b FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 1 AS a, 2 AS b) t1 GROUP BY a ORDER BY b DESC; possible key id select type table type key ref rows extra keys len 1 PRIMARY <derived2> ALL NULL NULL NULL NULL 2 Using temporary; Using filesort 2 DERIVED NULL NULL NULL NULL NULL NULL NULL No tables used 3 UNION NULL NULL NULL NULL NULL NULL NULL No tables used NULL UNION <union2,3> ALL NULL NULL NULL NULL NULL Using temporary RESULT 31 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 32. EXPLAIN in JSON: more complex queries EXPLAIN "query_block": { "union_result": { "ordering_operation": { "using_temporary_table": true, "using_filesort": true, "table_name": "<union2,3>", "grouping_operation": { "query_specifications": [ { "using_temporary_table": true, "query_block": { "using_filesort": false, "table": { "table": { "message": "No tables used" "table_name": "t1", } } }, { "materialized_from_subquery": { "query_block": { "using_temporary_table": true, "table": { "query_block": { "message": "No tables used" … here goes union_result… => } } } ] } /* union_result */ }}}}}} 32 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 33. EXPLAIN in JSON: more complex queries MySQL Workbench 5.2 SELECT a, b FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 1 AS a, 2 AS b) t1 GROUP BY a ORDER BY b DESC; 33 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 34. EXPLAIN in JSON: subqueries mysql> EXPLAIN FORMAT=JSON SELECT derived.vc FROM (SELECT * FROM t1) AS derived WHERE derived.vc IN (SELECT t2.vc1 FROM t2 JOIN t3 ON t2.vc2=t3.vc); select possible key id table type key ref rows extra type keys len 1 PRIMARY t2 ALL NULL NULL NULL NULL 2 Using where; Start materialize; Scan 1 PRIMARY t3 ALL NULL NULL NULL NULL 3 Using where; End materialize; Using join buffer (Block Nested Loop) 1 PRIMARY <derived2> ref <auto_key0> <auto_key0> 23 t2.vc1 2 NULL 2 DERIVED t1 ALL NULL NULL NULL NULL 2 NULL 34 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 35. EXPLAIN in JSON: subqueries EXPLAIN "query_block": { "table": { "select_id": 1, "table_name": "derived", "nested_loop": [ "materialized_from_subquery": { { "table": { "using_temporary_table": true, "table_name": "<subquery3>", "query_block": { "materialized_from_subquery": { "select_id": 2, "query_block": { "table": { "nested_loop": [ "table_name": "t1“, { "table": { "table_name": "t2“ } }, … { "table": { "table_name": "t3“ } } } ] } /* query_block */ } } /* table */ } /* query_block */ }, { … next table goes here … => } } /* materialized_from_subquery */ ] /* nested_loop */ } /* query_block */ } /* table */ 35 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 36. EXPLAIN in JSON: subqueries MySQL Workbench 5.2 SELECT derived.vc FROM (SELECT * FROM t1) AS derived WHERE derived.vc IN (SELECT t2.vc1 FROM t2 JOIN t3 ON t2.vc2=t3.vc); 36 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 37. EXPLAIN in JSON: subqueries mysql> EXPLAIN SELECT * FROM t1, t2 WHERE t2.a IN (SELECT a FROM t1 WHERE t1.b <> 30) AND t1.b=t2.a GROUP BY t1.a; select possible id table type key key len ref rows extra type keys 1 SIMPLE t2 index a a 5 NULL 4 Using where; Using index; Using temporary; Using filesort 1 SIMPLE t1 ref a a 5 test.t2.a 101 Using where; Using index; Start temporary; End temporary 1 SIMPLE t1 index NULL a 10 NULL 10004 Using where; Using index; Using join buffer (Block Nested Loop) 37 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 38. EXPLAIN in JSON: subqueries EXPLAIN "query_block": { { "select_id": 1, "duplicates_removal": { "grouping_operation": { "using_temporary_table": true, "using_temporary_table": true, "table": { "nested_loop": [ "table_name": "t1", { "attached_condition": "(`test`.`t1`.`b` <> 30)" "table": { } /* table */ "table_name": "t2", } /* duplicates_removal */ "attached_condition": "(`test`.`t2`.`a` is not null)" }, { } /* table */ "table": { }, "table_name": "t1", … next 2 tables => … "attached_condition": "(`test`.`t1`.`b` = `test`.`t2`.`a`)" ] /* nested_loop */ } /* grouping_operation */ } /* table */ } /* query_block */ } 38 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 39. EXPLAIN in JSON: subqueries MySQL Workbench 5.2 SELECT * FROM t1, t2 WHERE t2.a IN (SELECT a FROM t1 WHERE t1.b <> 30) AND t1.b=t2.a GROUP BY t1.a; 39 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 40. EXPLAIN in JSON: subqueries EXPLAIN "query_block": { "query_block": { "select_id": 1, "select_id": 1, "nested_loop": [ "nested_loop": [ { { "table": { "table": { "table_name": "t2", "table_name": "t1", } /* table */ "access_type": "range", "loosescan": true, }, { } /* table */ "table": { }, { "table_name": "t1", "table": { "first_match": "t2", "table_name": "t2", "attached_condition": "(`test`.`t1`.`b` <> 30)" } /* table */ } /* table */ } } ] /* nested_loop */ } /* query_block */ ] /* nested_loop */ } /* query_block */ 40 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 41. EXPLAIN for non-select queries 41 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 42. EXPLAINing non-select queries  INSERT/REPLACE and INSERT/REPLACE SELECT  Single- and multi-table UPDATE  Single- and multi-table DELETE 42 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 43. EXPLAINing non-select queries mysql> EXPLAIN UPDATE t1 SET a = 10 WHERE a < 10; id select type table type possible keys key key len ref rows extra 1 SIMPLE t1 range a,a_2 a 5 NULL 2 Using where; Using temporary 43 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 44. EXPLAINing non-select queries EXPLAIN "query_block": { "select_id": 1, "table": { "update": true, mysql> EXPLAIN FORMAT=JSON "table_name": "t1", "access_type": "range", UPDATE t1 SET a = 10 WHERE "possible_keys": [ "a", "a_2" ], a < 10; "key": "a", "key_length": "5", "rows": 2, "filtered": 100, "using_temporary_table": "for update", "attached_condition": "(`test`.`t1`.`a` < 10)" } /* table */ } /* query_block */ 44 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 45. EXPLAINing non-select queries EXPLAIN "query_block": { "select_id": 1, "table": { "delete": true, mysql> EXPLAIN FORMAT=JSON "table_name": "t1", "access_type": "range", DELETE FROM t1 WHERE a < 10; "possible_keys": [ "a", "a_2“ ], "key": "a", "key_length": "5", "rows": 2, "filtered": 100, "attached_condition": "(`test`.`t1`.`a` < 10)" } /* table */ } /* query_block */ 45 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 46. EXPLAINing non-select queries mysql> EXPLAIN UPDATE t1 t11, (SELECT * FROM t2) t12 SET t11.a =10 WHERE t11.a = 1; select possible id table type key key len ref rows extra type keys 1 PRIMARY t11 ref a,a_2 a 5 const 1 NULL 1 PRIMARY <derived2> ALL NULL NULL NULL NULL 3 Using join buffer (Block Nested Loop) 2 DERIVED t2 ALL NULL NULL NULL NULL 3 NULL 46 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 47. EXPLAINing non-select queries EXPLAIN "query_block": { { "select_id": 1, "table": { "nested_loop": [ { "table_name": "t12", "table": { "access_type": "ALL", "update": true, "rows": 3, "filtered": 100, "table_name": "t11", "using_join_buffer": "Block Nested Loop", "access_type": "ref", "materialized_from_subquery": { "possible_keys": [ "a", "a_2“ ], "using_temporary_table": true, "key": "a", "key_length": "5", "query_block": { "ref": ["const"] /* ref */, "select_id": 2, "rows": 1, "filtered": 100 "table": { … } /* table */ } /* table */ }, } /* query_block */ … here goes 2nd table…=> } /* materialized_from_subquery */ ] /* nested_loop */ } /* query_block */ } /* table */ } 47 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 48. EXPLAINing non-select queries mysql> EXPLAIN UPDATE t1 SET a = 10 WHERE a IN (SELECT a FROM t2); id select type table type possible keys key key len ref rows extra 1 PRIMARY t1 ALL a,a_2 NULL NULL NULL 3 NULL 1 DEPENDENT t2 ALL NULL NULL NULL NULL 3 Using where SUBQUERY 48 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 49. EXPLAINing non-select queries EXPLAIN "query_block": { [{ "select_id": 1, "dependent": true, "cacheable": false, "table": { "query_block": { "update": true, "select_id": 2, "table_name": "t1", "table": { "possible_keys": [ "a", "a_2“ ], "table_name": "t2", "attached_condition": "access_type": "ALL", "<in_optimizer>(`test`.`t1`.`a`, "rows": 3, "filtered": 100, <exists>(select 1 from `test`.`t2` where "attached_condition": (<cache>(`test`.`t1`.`a`) = "(<cache>(`test`.`t1`.`a`) = `test`.`t2`.`b`)" `test`.`t1`.`a`)))", } /* table */ "attached_subqueries": [ … => …] } /* query_block */ } /* table */ }] } /* query_block */ 49 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12
  • 50. 50 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Insert Information Protection Policy Classification from Slide 12