6929 lines
		
	
	
		
			257 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			6929 lines
		
	
	
		
			257 KiB
		
	
	
	
		
			Plaintext
		
	
	
| SET optimizer_trace_max_mem_size=1048576;
 | |
| SET end_markers_in_json=on;
 | |
| SET optimizer_trace="enabled=on,one_line=off";
 | |
| CREATE TABLE t1
 | |
| (
 | |
| key1 INT NOT NULL,
 | |
| INDEX i1(key1)
 | |
| );
 | |
| Inserting 1024 records into t1
 | |
| ALTER TABLE t1 ADD key2 INT NOT NULL, ADD INDEX i2(key2);
 | |
| ALTER TABLE t1 ADD key3 INT NOT NULL, ADD INDEX i3(key3);
 | |
| ALTER TABLE t1 ADD key4 INT NOT NULL, ADD INDEX i4(key4);
 | |
| ALTER TABLE t1 ADD key5 INT NOT NULL, ADD INDEX i5(key5);
 | |
| ALTER TABLE t1 ADD key6 INT NOT NULL, ADD INDEX i6(key6);
 | |
| ALTER TABLE t1 ADD key7 INT NOT NULL, ADD INDEX i7(key7);
 | |
| ALTER TABLE t1 ADD key8 INT NOT NULL, ADD INDEX i8(key8);
 | |
| UPDATE t1 SET 
 | |
| key2=key1,
 | |
| key3=key1,
 | |
| key4=key1,
 | |
| key5=key1,
 | |
| key6=key1,
 | |
| key7=key1,
 | |
| key8=1024-key1;
 | |
| CREATE TABLE t2 (
 | |
| key1a INT NOT NULL,
 | |
| key1b INT NOT NULL,
 | |
| key2  INT NOT NULL,
 | |
| key2_1 INT NOT NULL,
 | |
| key2_2 INT NOT NULL,
 | |
| key3  INT NOT NULL,
 | |
| primary key i1a (key1a, key1b),
 | |
| INDEX i1b (key1b, key1a),
 | |
| INDEX i2_1(key2, key2_1),
 | |
| INDEX i2_2(key2, key2_1)
 | |
| );
 | |
| Warnings:
 | |
| Warning	1831	Duplicate index 'i2_2' defined on the table 'test.t2'. This is deprecated and will be disallowed in a future release.
 | |
| INSERT INTO t2 SELECT key1,key1,key1 div 10, key1 % 10, key1 % 10, key1 FROM t1;
 | |
| 
 | |
| EXPLAIN SELECT * FROM t1 WHERE key2 < 5 OR key2 > 1020;
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t1	NULL	range	i2	i2	4	NULL	47	100.00	Using index condition
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select `test`.`t1`.`key1` AS `key1`,`test`.`t1`.`key2` AS `key2`,`test`.`t1`.`key3` AS `key3`,`test`.`t1`.`key4` AS `key4`,`test`.`t1`.`key5` AS `key5`,`test`.`t1`.`key6` AS `key6`,`test`.`t1`.`key7` AS `key7`,`test`.`t1`.`key8` AS `key8` from `test`.`t1` where ((`test`.`t1`.`key2` < 5) or (`test`.`t1`.`key2` > 1020))
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT * FROM t1 WHERE key2 < 5 OR key2 > 1020	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select `t1`.`key1` AS `key1`,`t1`.`key2` AS `key2`,`t1`.`key3` AS `key3`,`t1`.`key4` AS `key4`,`t1`.`key5` AS `key5`,`t1`.`key6` AS `key6`,`t1`.`key7` AS `key7`,`t1`.`key8` AS `key8` from `t1` where ((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 1024,
 | |
|                     "cost": 107.06
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "i1",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key2"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i3",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i4",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i5",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i6",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i7",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i8",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "setup_range_conditions": [
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "group_index_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "not_group_by_or_distinct"
 | |
|                   } /* group_index_range */,
 | |
|                   "skip_scan_range": {
 | |
|                     "potential_skip_scan_indexes": [
 | |
|                       {
 | |
|                         "index": "i2",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       }
 | |
|                     ] /* potential_skip_scan_indexes */
 | |
|                   } /* skip_scan_range */,
 | |
|                   "analyzing_range_alternatives": {
 | |
|                     "range_scan_alternatives": [
 | |
|                       {
 | |
|                         "index": "i2",
 | |
|                         "ranges": [
 | |
|                           "key2 < 5",
 | |
|                           "1020 < key2"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": false,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 47,
 | |
|                         "cost": 16.96,
 | |
|                         "chosen": true
 | |
|                       }
 | |
|                     ] /* range_scan_alternatives */,
 | |
|                     "analyzing_roworder_intersect": {
 | |
|                       "usable": false,
 | |
|                       "cause": "too_few_roworder_scans"
 | |
|                     } /* analyzing_roworder_intersect */
 | |
|                   } /* analyzing_range_alternatives */,
 | |
|                   "chosen_range_access_summary": {
 | |
|                     "range_access_plan": {
 | |
|                       "type": "range_scan",
 | |
|                       "index": "i2",
 | |
|                       "rows": 47,
 | |
|                       "ranges": [
 | |
|                         "key2 < 5",
 | |
|                         "1020 < key2"
 | |
|                       ] /* ranges */
 | |
|                     } /* range_access_plan */,
 | |
|                     "rows_for_plan": 47,
 | |
|                     "cost_for_plan": 16.96,
 | |
|                     "chosen": true
 | |
|                   } /* chosen_range_access_summary */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t1`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "rows_to_scan": 47,
 | |
|                       "filtering_effect": [
 | |
|                       ] /* filtering_effect */,
 | |
|                       "final_filtering_effect": 1,
 | |
|                       "access_type": "range",
 | |
|                       "range_details": {
 | |
|                         "used_index": "i2"
 | |
|                       } /* range_details */,
 | |
|                       "resulting_rows": 47,
 | |
|                       "cost": 21.66,
 | |
|                       "chosen": true
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 47,
 | |
|                 "cost_for_plan": 21.66,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t1`",
 | |
|                   "attached": "((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "original_table_condition": "((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))",
 | |
|                 "final_table_condition   ": "((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))"
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "pushed_index_condition": "((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))",
 | |
|                 "table_condition_attached": null
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| set @@optimizer_trace_features="range_optimizer=off";
 | |
| 
 | |
| EXPLAIN SELECT * FROM t1 WHERE key2 < 5 OR key2 > 1020;
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t1	NULL	range	i2	i2	4	NULL	47	100.00	Using index condition
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select `test`.`t1`.`key1` AS `key1`,`test`.`t1`.`key2` AS `key2`,`test`.`t1`.`key3` AS `key3`,`test`.`t1`.`key4` AS `key4`,`test`.`t1`.`key5` AS `key5`,`test`.`t1`.`key6` AS `key6`,`test`.`t1`.`key7` AS `key7`,`test`.`t1`.`key8` AS `key8` from `test`.`t1` where ((`test`.`t1`.`key2` < 5) or (`test`.`t1`.`key2` > 1020))
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT * FROM t1 WHERE key2 < 5 OR key2 > 1020	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select `t1`.`key1` AS `key1`,`t1`.`key2` AS `key2`,`t1`.`key3` AS `key3`,`t1`.`key4` AS `key4`,`t1`.`key5` AS `key5`,`t1`.`key6` AS `key6`,`t1`.`key7` AS `key7`,`t1`.`key8` AS `key8` from `t1` where ((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 1024,
 | |
|                     "cost": 107.06
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": "...",
 | |
|                   "setup_range_conditions": [
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "group_index_range": "...",
 | |
|                   "skip_scan_range": "...",
 | |
|                   "analyzing_range_alternatives": "...",
 | |
|                   "chosen_range_access_summary": {
 | |
|                     "range_access_plan": {
 | |
|                       "type": "range_scan",
 | |
|                       "index": "i2",
 | |
|                       "rows": 47,
 | |
|                       "ranges": [
 | |
|                         "key2 < 5",
 | |
|                         "1020 < key2"
 | |
|                       ] /* ranges */
 | |
|                     } /* range_access_plan */,
 | |
|                     "rows_for_plan": 47,
 | |
|                     "cost_for_plan": 16.96,
 | |
|                     "chosen": true
 | |
|                   } /* chosen_range_access_summary */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t1`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "rows_to_scan": 47,
 | |
|                       "filtering_effect": [
 | |
|                       ] /* filtering_effect */,
 | |
|                       "final_filtering_effect": 1,
 | |
|                       "access_type": "range",
 | |
|                       "range_details": {
 | |
|                         "used_index": "i2"
 | |
|                       } /* range_details */,
 | |
|                       "resulting_rows": 47,
 | |
|                       "cost": 21.66,
 | |
|                       "chosen": true
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 47,
 | |
|                 "cost_for_plan": 21.66,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t1`",
 | |
|                   "attached": "((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "original_table_condition": "((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))",
 | |
|                 "final_table_condition   ": "((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))"
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "pushed_index_condition": "((`t1`.`key2` < 5) or (`t1`.`key2` > 1020))",
 | |
|                 "table_condition_attached": null
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| set @@optimizer_trace_features="range_optimizer=on";
 | |
| 
 | |
| EXPLAIN SELECT * FROM t1 WHERE key1 < 3 OR key2 > 1020;
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t1	NULL	index_merge	i1,i2	i1,i2	4,4	NULL	45	100.00	Using sort_union(i1,i2); Using where
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select `test`.`t1`.`key1` AS `key1`,`test`.`t1`.`key2` AS `key2`,`test`.`t1`.`key3` AS `key3`,`test`.`t1`.`key4` AS `key4`,`test`.`t1`.`key5` AS `key5`,`test`.`t1`.`key6` AS `key6`,`test`.`t1`.`key7` AS `key7`,`test`.`t1`.`key8` AS `key8` from `test`.`t1` where ((`test`.`t1`.`key1` < 3) or (`test`.`t1`.`key2` > 1020))
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT * FROM t1 WHERE key1 < 3 OR key2 > 1020	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select `t1`.`key1` AS `key1`,`t1`.`key2` AS `key2`,`t1`.`key3` AS `key3`,`t1`.`key4` AS `key4`,`t1`.`key5` AS `key5`,`t1`.`key6` AS `key6`,`t1`.`key7` AS `key7`,`t1`.`key8` AS `key8` from `t1` where ((`t1`.`key1` < 3) or (`t1`.`key2` > 1020))"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "((`t1`.`key1` < 3) or (`t1`.`key2` > 1020))",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "((`t1`.`key1` < 3) or (`t1`.`key2` > 1020))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "((`t1`.`key1` < 3) or (`t1`.`key2` > 1020))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "((`t1`.`key1` < 3) or (`t1`.`key2` > 1020))"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 1024,
 | |
|                     "cost": 107.06
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "i1",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key1"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key2"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i3",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i4",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i5",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i6",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i7",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i8",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "setup_range_conditions": [
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "group_index_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "not_group_by_or_distinct"
 | |
|                   } /* group_index_range */,
 | |
|                   "skip_scan_range": {
 | |
|                     "potential_skip_scan_indexes": [
 | |
|                       {
 | |
|                         "index": "i1",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i2",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       }
 | |
|                     ] /* potential_skip_scan_indexes */
 | |
|                   } /* skip_scan_range */,
 | |
|                   "analyzing_range_alternatives": {
 | |
|                     "range_scan_alternatives": [
 | |
|                     ] /* range_scan_alternatives */,
 | |
|                     "analyzing_roworder_intersect": {
 | |
|                       "usable": false,
 | |
|                       "cause": "too_few_roworder_scans"
 | |
|                     } /* analyzing_roworder_intersect */
 | |
|                   } /* analyzing_range_alternatives */,
 | |
|                   "analyzing_index_merge_union": [
 | |
|                     {
 | |
|                       "indexes_to_merge": [
 | |
|                         {
 | |
|                           "range_scan_alternatives": [
 | |
|                             {
 | |
|                               "index": "i1",
 | |
|                               "ranges": [
 | |
|                                 "key1 < 3"
 | |
|                               ] /* ranges */,
 | |
|                               "index_dives_for_eq_ranges": true,
 | |
|                               "rowid_ordered": false,
 | |
|                               "using_mrr": false,
 | |
|                               "index_only": true,
 | |
|                               "rows": 3,
 | |
|                               "cost": 0.5706,
 | |
|                               "chosen": true
 | |
|                             }
 | |
|                           ] /* range_scan_alternatives */,
 | |
|                           "index_to_merge": "i1",
 | |
|                           "cumulated_cost": 0.5706
 | |
|                         },
 | |
|                         {
 | |
|                           "range_scan_alternatives": [
 | |
|                             {
 | |
|                               "index": "i2",
 | |
|                               "ranges": [
 | |
|                                 "1020 < key2"
 | |
|                               ] /* ranges */,
 | |
|                               "index_dives_for_eq_ranges": true,
 | |
|                               "rowid_ordered": false,
 | |
|                               "using_mrr": false,
 | |
|                               "index_only": true,
 | |
|                               "rows": 42,
 | |
|                               "cost": 4.6781,
 | |
|                               "chosen": true
 | |
|                             }
 | |
|                           ] /* range_scan_alternatives */,
 | |
|                           "index_to_merge": "i2",
 | |
|                           "cumulated_cost": 5.2487
 | |
|                         }
 | |
|                       ] /* indexes_to_merge */,
 | |
|                       "cost_of_reading_ranges": 5.2487,
 | |
|                       "cost_sort_rowid_and_read_disk": 2.2388,
 | |
|                       "cost_duplicate_removal": 19.181,
 | |
|                       "total_cost": 26.668
 | |
|                     }
 | |
|                   ] /* analyzing_index_merge_union */,
 | |
|                   "chosen_range_access_summary": {
 | |
|                     "range_access_plan": {
 | |
|                       "type": "index_merge",
 | |
|                       "index_merge_of": [
 | |
|                         {
 | |
|                           "type": "range_scan",
 | |
|                           "index": "i1",
 | |
|                           "rows": 3,
 | |
|                           "ranges": [
 | |
|                             "key1 < 3"
 | |
|                           ] /* ranges */
 | |
|                         },
 | |
|                         {
 | |
|                           "type": "range_scan",
 | |
|                           "index": "i2",
 | |
|                           "rows": 42,
 | |
|                           "ranges": [
 | |
|                             "1020 < key2"
 | |
|                           ] /* ranges */
 | |
|                         }
 | |
|                       ] /* index_merge_of */
 | |
|                     } /* range_access_plan */,
 | |
|                     "rows_for_plan": 45,
 | |
|                     "cost_for_plan": 26.668,
 | |
|                     "chosen": true
 | |
|                   } /* chosen_range_access_summary */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t1`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "rows_to_scan": 45,
 | |
|                       "filtering_effect": [
 | |
|                       ] /* filtering_effect */,
 | |
|                       "final_filtering_effect": 1,
 | |
|                       "access_type": "range",
 | |
|                       "range_details": {
 | |
|                         "used_index": "sort_union(i1,i2)"
 | |
|                       } /* range_details */,
 | |
|                       "resulting_rows": 45,
 | |
|                       "cost": 31.168,
 | |
|                       "chosen": true
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 45,
 | |
|                 "cost_for_plan": 31.168,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "((`t1`.`key1` < 3) or (`t1`.`key2` > 1020))",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t1`",
 | |
|                   "attached": "((`t1`.`key1` < 3) or (`t1`.`key2` > 1020))"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "original_table_condition": "((`t1`.`key1` < 3) or (`t1`.`key2` > 1020))",
 | |
|                 "final_table_condition   ": "((`t1`.`key1` < 3) or (`t1`.`key2` > 1020))"
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t1`"
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| 
 | |
| EXPLAIN SELECT key2, MIN(key2_1) FROM t2 GROUP BY key2;
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t2	NULL	range	i2_1,i2_2	i2_1	4	NULL	103	100.00	Using index for group-by
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select `test`.`t2`.`key2` AS `key2`,min(`test`.`t2`.`key2_1`) AS `MIN(key2_1)` from `test`.`t2` group by `test`.`t2`.`key2`
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT key2, MIN(key2_1) FROM t2 GROUP BY key2	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select `t2`.`key2` AS `key2`,min(`t2`.`key2_1`) AS `MIN(key2_1)` from `t2` group by `t2`.`key2`"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "const_keys_added": {
 | |
|                   "keys": [
 | |
|                     "i2_1",
 | |
|                     "i2_2"
 | |
|                   ] /* keys */,
 | |
|                   "cause": "group_by"
 | |
|                 } /* const_keys_added */,
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 1024,
 | |
|                     "cost": 106.56
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "PRIMARY",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i1b",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2_1",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key2",
 | |
|                         "key2_1"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2_2",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key2",
 | |
|                         "key2_1"
 | |
|                       ] /* key_parts */
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "best_covering_index_scan": {
 | |
|                     "index": "i2_1",
 | |
|                     "cost": 109.96,
 | |
|                     "chosen": false,
 | |
|                     "cause": "cost"
 | |
|                   } /* best_covering_index_scan */,
 | |
|                   "group_index_range": {
 | |
|                     "potential_group_range_indexes": [
 | |
|                       {
 | |
|                         "index": "i2_1",
 | |
|                         "covering": true,
 | |
|                         "rows": 103,
 | |
|                         "cost": 28.1
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i2_2",
 | |
|                         "covering": true,
 | |
|                         "rows": 103,
 | |
|                         "cost": 28.1
 | |
|                       }
 | |
|                     ] /* potential_group_range_indexes */
 | |
|                   } /* group_index_range */,
 | |
|                   "best_group_range_summary": {
 | |
|                     "type": "index_group",
 | |
|                     "index": "i2_1",
 | |
|                     "group_attribute": "key2_1",
 | |
|                     "min_aggregate": true,
 | |
|                     "max_aggregate": false,
 | |
|                     "distinct_aggregate": false,
 | |
|                     "rows": 103,
 | |
|                     "cost": 28.1,
 | |
|                     "key_parts_used_for_access": [
 | |
|                       "key2"
 | |
|                     ] /* key_parts_used_for_access */,
 | |
|                     "ranges": [
 | |
|                     ] /* ranges */,
 | |
|                     "chosen": true
 | |
|                   } /* best_group_range_summary */,
 | |
|                   "skip_scan_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "has_group_by"
 | |
|                   } /* skip_scan_range */,
 | |
|                   "chosen_range_access_summary": {
 | |
|                     "range_access_plan": {
 | |
|                       "type": "index_group",
 | |
|                       "index": "i2_1",
 | |
|                       "group_attribute": "key2_1",
 | |
|                       "min_aggregate": true,
 | |
|                       "max_aggregate": false,
 | |
|                       "distinct_aggregate": false,
 | |
|                       "rows": 103,
 | |
|                       "cost": 28.1,
 | |
|                       "key_parts_used_for_access": [
 | |
|                         "key2"
 | |
|                       ] /* key_parts_used_for_access */,
 | |
|                       "ranges": [
 | |
|                       ] /* ranges */
 | |
|                     } /* range_access_plan */,
 | |
|                     "rows_for_plan": 103,
 | |
|                     "cost_for_plan": 28.1,
 | |
|                     "chosen": true
 | |
|                   } /* chosen_range_access_summary */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t2`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "rows_to_scan": 103,
 | |
|                       "access_type": "range",
 | |
|                       "range_details": {
 | |
|                         "used_index": "index_for_group_by(i2_1)"
 | |
|                       } /* range_details */,
 | |
|                       "resulting_rows": 103,
 | |
|                       "cost": 38.4,
 | |
|                       "chosen": true,
 | |
|                       "use_tmp_table": true
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 103,
 | |
|                 "cost_for_plan": 38.4,
 | |
|                 "sort_cost": 103,
 | |
|                 "new_cost_for_plan": 141.4,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": null,
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t2`",
 | |
|                   "attached": null
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "optimizing_distinct_group_by_order_by": {
 | |
|               "simplifying_group_by": {
 | |
|                 "original_clause": "`t2`.`key2`",
 | |
|                 "items": [
 | |
|                   {
 | |
|                     "item": "`t2`.`key2`"
 | |
|                   }
 | |
|                 ] /* items */,
 | |
|                 "resulting_clause_is_simple": true,
 | |
|                 "resulting_clause": "`t2`.`key2`"
 | |
|               } /* simplifying_group_by */
 | |
|             } /* optimizing_distinct_group_by_order_by */
 | |
|           },
 | |
|           {
 | |
|             "reconsidering_access_paths_for_index_ordering": {
 | |
|               "clause": "GROUP BY",
 | |
|               "steps": [
 | |
|               ] /* steps */,
 | |
|               "index_order_summary": {
 | |
|                 "table": "`t2`",
 | |
|                 "index_provides_order": true,
 | |
|                 "order_direction": "asc",
 | |
|                 "index": "i2_1",
 | |
|                 "plan_changed": false
 | |
|               } /* index_order_summary */
 | |
|             } /* reconsidering_access_paths_for_index_ordering */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t2`"
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           },
 | |
|           {
 | |
|             "considering_tmp_tables": [
 | |
|             ] /* considering_tmp_tables */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| EXPLAIN SELECT DISTINCT key2 FROM t2;
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t2	NULL	range	i2_1,i2_2	i2_1	4	NULL	103	100.00	Using index for group-by
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select distinct `test`.`t2`.`key2` AS `key2` from `test`.`t2`
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT DISTINCT key2 FROM t2	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select distinct `t2`.`key2` AS `key2` from `t2`"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "const_keys_added": {
 | |
|                   "keys": [
 | |
|                     "i2_1",
 | |
|                     "i2_2"
 | |
|                   ] /* keys */,
 | |
|                   "cause": "distinct"
 | |
|                 } /* const_keys_added */,
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 1024,
 | |
|                     "cost": 106.56
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "PRIMARY",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i1b",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2_1",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key2",
 | |
|                         "key2_1"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2_2",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key2",
 | |
|                         "key2_1"
 | |
|                       ] /* key_parts */
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "best_covering_index_scan": {
 | |
|                     "index": "i2_1",
 | |
|                     "cost": 109.96,
 | |
|                     "chosen": false,
 | |
|                     "cause": "cost"
 | |
|                   } /* best_covering_index_scan */,
 | |
|                   "group_index_range": {
 | |
|                     "distinct_query": true,
 | |
|                     "potential_group_range_indexes": [
 | |
|                       {
 | |
|                         "index": "i2_1",
 | |
|                         "covering": true,
 | |
|                         "rows": 103,
 | |
|                         "cost": 28.1
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i2_2",
 | |
|                         "covering": true,
 | |
|                         "rows": 103,
 | |
|                         "cost": 28.1
 | |
|                       }
 | |
|                     ] /* potential_group_range_indexes */
 | |
|                   } /* group_index_range */,
 | |
|                   "best_group_range_summary": {
 | |
|                     "type": "index_group",
 | |
|                     "index": "i2_1",
 | |
|                     "group_attribute": null,
 | |
|                     "min_aggregate": false,
 | |
|                     "max_aggregate": false,
 | |
|                     "distinct_aggregate": false,
 | |
|                     "rows": 103,
 | |
|                     "cost": 28.1,
 | |
|                     "key_parts_used_for_access": [
 | |
|                       "key2"
 | |
|                     ] /* key_parts_used_for_access */,
 | |
|                     "ranges": [
 | |
|                     ] /* ranges */,
 | |
|                     "chosen": true
 | |
|                   } /* best_group_range_summary */,
 | |
|                   "skip_scan_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "disjuntive_predicate_present"
 | |
|                   } /* skip_scan_range */,
 | |
|                   "chosen_range_access_summary": {
 | |
|                     "range_access_plan": {
 | |
|                       "type": "index_group",
 | |
|                       "index": "i2_1",
 | |
|                       "group_attribute": null,
 | |
|                       "min_aggregate": false,
 | |
|                       "max_aggregate": false,
 | |
|                       "distinct_aggregate": false,
 | |
|                       "rows": 103,
 | |
|                       "cost": 28.1,
 | |
|                       "key_parts_used_for_access": [
 | |
|                         "key2"
 | |
|                       ] /* key_parts_used_for_access */,
 | |
|                       "ranges": [
 | |
|                       ] /* ranges */
 | |
|                     } /* range_access_plan */,
 | |
|                     "rows_for_plan": 103,
 | |
|                     "cost_for_plan": 28.1,
 | |
|                     "chosen": true
 | |
|                   } /* chosen_range_access_summary */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t2`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "rows_to_scan": 103,
 | |
|                       "access_type": "range",
 | |
|                       "range_details": {
 | |
|                         "used_index": "index_for_group_by(i2_1)"
 | |
|                       } /* range_details */,
 | |
|                       "resulting_rows": 103,
 | |
|                       "cost": 38.4,
 | |
|                       "chosen": true
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 103,
 | |
|                 "cost_for_plan": 38.4,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": null,
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t2`",
 | |
|                   "attached": null
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "optimizing_distinct_group_by_order_by": {
 | |
|               "changed_distinct_to_group_by": true,
 | |
|               "simplifying_group_by": {
 | |
|                 "original_clause": "`t2`.`key2`",
 | |
|                 "items": [
 | |
|                   {
 | |
|                     "item": "`t2`.`key2`"
 | |
|                   }
 | |
|                 ] /* items */,
 | |
|                 "resulting_clause_is_simple": true,
 | |
|                 "resulting_clause": "`t2`.`key2`"
 | |
|               } /* simplifying_group_by */
 | |
|             } /* optimizing_distinct_group_by_order_by */
 | |
|           },
 | |
|           {
 | |
|             "reconsidering_access_paths_for_index_ordering": {
 | |
|               "clause": "GROUP BY",
 | |
|               "steps": [
 | |
|               ] /* steps */,
 | |
|               "index_order_summary": {
 | |
|                 "table": "`t2`",
 | |
|                 "index_provides_order": true,
 | |
|                 "order_direction": "asc",
 | |
|                 "index": "i2_1",
 | |
|                 "plan_changed": false
 | |
|               } /* index_order_summary */
 | |
|             } /* reconsidering_access_paths_for_index_ordering */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t2`"
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           },
 | |
|           {
 | |
|             "considering_tmp_tables": [
 | |
|             ] /* considering_tmp_tables */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| 
 | |
| EXPLAIN SELECT key2, MIN(key2_1) FROM t2 
 | |
| WHERE key2 = 5 or key2 = 4 or key2 = 3 or key2 = 2 or key2 = 1 
 | |
| GROUP BY key2;
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t2	NULL	range	i2_1,i2_2	i2_1	4	NULL	47	100.00	Using where; Using index
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select `test`.`t2`.`key2` AS `key2`,min(`test`.`t2`.`key2_1`) AS `MIN(key2_1)` from `test`.`t2` where ((`test`.`t2`.`key2` = 5) or (`test`.`t2`.`key2` = 4) or (`test`.`t2`.`key2` = 3) or (`test`.`t2`.`key2` = 2) or (`test`.`t2`.`key2` = 1)) group by `test`.`t2`.`key2`
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT key2, MIN(key2_1) FROM t2 
 | |
| WHERE key2 = 5 or key2 = 4 or key2 = 3 or key2 = 2 or key2 = 1 
 | |
| GROUP BY key2	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select `t2`.`key2` AS `key2`,min(`t2`.`key2_1`) AS `MIN(key2_1)` from `t2` where ((`t2`.`key2` = 5) or (`t2`.`key2` = 4) or (`t2`.`key2` = 3) or (`t2`.`key2` = 2) or (`t2`.`key2` = 1)) group by `t2`.`key2`"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "((`t2`.`key2` = 5) or (`t2`.`key2` = 4) or (`t2`.`key2` = 3) or (`t2`.`key2` = 2) or (`t2`.`key2` = 1))",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "(multiple equal(5, `t2`.`key2`) or multiple equal(4, `t2`.`key2`) or multiple equal(3, `t2`.`key2`) or multiple equal(2, `t2`.`key2`) or multiple equal(1, `t2`.`key2`))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "(multiple equal(5, `t2`.`key2`) or multiple equal(4, `t2`.`key2`) or multiple equal(3, `t2`.`key2`) or multiple equal(2, `t2`.`key2`) or multiple equal(1, `t2`.`key2`))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "(multiple equal(5, `t2`.`key2`) or multiple equal(4, `t2`.`key2`) or multiple equal(3, `t2`.`key2`) or multiple equal(2, `t2`.`key2`) or multiple equal(1, `t2`.`key2`))"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 1024,
 | |
|                     "cost": 106.56
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "PRIMARY",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i1b",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2_1",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key2",
 | |
|                         "key2_1"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2_2",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key2",
 | |
|                         "key2_1"
 | |
|                       ] /* key_parts */
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "best_covering_index_scan": {
 | |
|                     "index": "i2_1",
 | |
|                     "cost": 109.96,
 | |
|                     "chosen": false,
 | |
|                     "cause": "cost"
 | |
|                   } /* best_covering_index_scan */,
 | |
|                   "setup_range_conditions": [
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "group_index_range": {
 | |
|                     "potential_group_range_indexes": [
 | |
|                       {
 | |
|                         "index": "i2_1",
 | |
|                         "covering": true,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "ranges": [
 | |
|                           "1 <= key2 <= 1",
 | |
|                           "2 <= key2 <= 2",
 | |
|                           "3 <= key2 <= 3",
 | |
|                           "4 <= key2 <= 4",
 | |
|                           "5 <= key2 <= 5"
 | |
|                         ] /* ranges */,
 | |
|                         "rows": 5,
 | |
|                         "cost": 8.5
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i2_2",
 | |
|                         "covering": true,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "ranges": [
 | |
|                           "1 <= key2 <= 1",
 | |
|                           "2 <= key2 <= 2",
 | |
|                           "3 <= key2 <= 3",
 | |
|                           "4 <= key2 <= 4",
 | |
|                           "5 <= key2 <= 5"
 | |
|                         ] /* ranges */,
 | |
|                         "rows": 5,
 | |
|                         "cost": 8.5
 | |
|                       }
 | |
|                     ] /* potential_group_range_indexes */
 | |
|                   } /* group_index_range */,
 | |
|                   "best_group_range_summary": {
 | |
|                     "type": "index_group",
 | |
|                     "index": "i2_1",
 | |
|                     "group_attribute": "key2_1",
 | |
|                     "min_aggregate": true,
 | |
|                     "max_aggregate": false,
 | |
|                     "distinct_aggregate": false,
 | |
|                     "rows": 5,
 | |
|                     "cost": 8.5,
 | |
|                     "key_parts_used_for_access": [
 | |
|                       "key2"
 | |
|                     ] /* key_parts_used_for_access */,
 | |
|                     "ranges": [
 | |
|                       "1 <= key2 <= 1",
 | |
|                       "2 <= key2 <= 2",
 | |
|                       "3 <= key2 <= 3",
 | |
|                       "4 <= key2 <= 4",
 | |
|                       "5 <= key2 <= 5"
 | |
|                     ] /* ranges */,
 | |
|                     "chosen": true
 | |
|                   } /* best_group_range_summary */,
 | |
|                   "skip_scan_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "has_group_by"
 | |
|                   } /* skip_scan_range */,
 | |
|                   "analyzing_range_alternatives": {
 | |
|                     "range_scan_alternatives": [
 | |
|                       {
 | |
|                         "index": "i2_1",
 | |
|                         "ranges": [
 | |
|                           "1 <= key2 <= 1",
 | |
|                           "2 <= key2 <= 2",
 | |
|                           "3 <= key2 <= 3",
 | |
|                           "4 <= key2 <= 4",
 | |
|                           "5 <= key2 <= 5"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": false,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": true,
 | |
|                         "rows": 47,
 | |
|                         "cost": 5.2886,
 | |
|                         "chosen": true
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i2_2",
 | |
|                         "ranges": [
 | |
|                           "1 <= key2 <= 1",
 | |
|                           "2 <= key2 <= 2",
 | |
|                           "3 <= key2 <= 3",
 | |
|                           "4 <= key2 <= 4",
 | |
|                           "5 <= key2 <= 5"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": false,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": true,
 | |
|                         "rows": 47,
 | |
|                         "cost": 5.2886,
 | |
|                         "chosen": false,
 | |
|                         "cause": "cost"
 | |
|                       }
 | |
|                     ] /* range_scan_alternatives */,
 | |
|                     "analyzing_roworder_intersect": {
 | |
|                       "usable": false,
 | |
|                       "cause": "too_few_roworder_scans"
 | |
|                     } /* analyzing_roworder_intersect */
 | |
|                   } /* analyzing_range_alternatives */,
 | |
|                   "chosen_range_access_summary": {
 | |
|                     "range_access_plan": {
 | |
|                       "type": "range_scan",
 | |
|                       "index": "i2_1",
 | |
|                       "rows": 47,
 | |
|                       "ranges": [
 | |
|                         "1 <= key2 <= 1",
 | |
|                         "2 <= key2 <= 2",
 | |
|                         "3 <= key2 <= 3",
 | |
|                         "4 <= key2 <= 4",
 | |
|                         "5 <= key2 <= 5"
 | |
|                       ] /* ranges */
 | |
|                     } /* range_access_plan */,
 | |
|                     "rows_for_plan": 47,
 | |
|                     "cost_for_plan": 5.2886,
 | |
|                     "chosen": true
 | |
|                   } /* chosen_range_access_summary */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t2`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "rows_to_scan": 47,
 | |
|                       "filtering_effect": [
 | |
|                       ] /* filtering_effect */,
 | |
|                       "final_filtering_effect": 1,
 | |
|                       "access_type": "range",
 | |
|                       "range_details": {
 | |
|                         "used_index": "i2_1"
 | |
|                       } /* range_details */,
 | |
|                       "resulting_rows": 47,
 | |
|                       "cost": 9.9886,
 | |
|                       "chosen": true,
 | |
|                       "use_tmp_table": true
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 47,
 | |
|                 "cost_for_plan": 9.9886,
 | |
|                 "sort_cost": 47,
 | |
|                 "new_cost_for_plan": 56.989,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "((`t2`.`key2` = 5) or (`t2`.`key2` = 4) or (`t2`.`key2` = 3) or (`t2`.`key2` = 2) or (`t2`.`key2` = 1))",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t2`",
 | |
|                   "attached": "((`t2`.`key2` = 5) or (`t2`.`key2` = 4) or (`t2`.`key2` = 3) or (`t2`.`key2` = 2) or (`t2`.`key2` = 1))"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "optimizing_distinct_group_by_order_by": {
 | |
|               "simplifying_group_by": {
 | |
|                 "original_clause": "`t2`.`key2`",
 | |
|                 "items": [
 | |
|                   {
 | |
|                     "item": "`t2`.`key2`"
 | |
|                   }
 | |
|                 ] /* items */,
 | |
|                 "resulting_clause_is_simple": true,
 | |
|                 "resulting_clause": "`t2`.`key2`"
 | |
|               } /* simplifying_group_by */
 | |
|             } /* optimizing_distinct_group_by_order_by */
 | |
|           },
 | |
|           {
 | |
|             "reconsidering_access_paths_for_index_ordering": {
 | |
|               "clause": "GROUP BY",
 | |
|               "steps": [
 | |
|               ] /* steps */,
 | |
|               "index_order_summary": {
 | |
|                 "table": "`t2`",
 | |
|                 "index_provides_order": true,
 | |
|                 "order_direction": "asc",
 | |
|                 "index": "i2_1",
 | |
|                 "plan_changed": false
 | |
|               } /* index_order_summary */
 | |
|             } /* reconsidering_access_paths_for_index_ordering */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "original_table_condition": "((`t2`.`key2` = 5) or (`t2`.`key2` = 4) or (`t2`.`key2` = 3) or (`t2`.`key2` = 2) or (`t2`.`key2` = 1))",
 | |
|                 "final_table_condition   ": "((`t2`.`key2` = 5) or (`t2`.`key2` = 4) or (`t2`.`key2` = 3) or (`t2`.`key2` = 2) or (`t2`.`key2` = 1))"
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t2`"
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           },
 | |
|           {
 | |
|             "considering_tmp_tables": [
 | |
|             ] /* considering_tmp_tables */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| 
 | |
| EXPLAIN SELECT * FROM t2 WHERE key2 = 1 AND (key2_1 = 1 OR key3 = 5);
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t2	NULL	ref	i2_1,i2_2	i2_1	4	const	10	19.00	Using where
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select `test`.`t2`.`key1a` AS `key1a`,`test`.`t2`.`key1b` AS `key1b`,`test`.`t2`.`key2` AS `key2`,`test`.`t2`.`key2_1` AS `key2_1`,`test`.`t2`.`key2_2` AS `key2_2`,`test`.`t2`.`key3` AS `key3` from `test`.`t2` where ((`test`.`t2`.`key2` = 1) and ((`test`.`t2`.`key2_1` = 1) or (`test`.`t2`.`key3` = 5)))
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT * FROM t2 WHERE key2 = 1 AND (key2_1 = 1 OR key3 = 5)	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select `t2`.`key1a` AS `key1a`,`t2`.`key1b` AS `key1b`,`t2`.`key2` AS `key2`,`t2`.`key2_1` AS `key2_1`,`t2`.`key2_2` AS `key2_2`,`t2`.`key3` AS `key3` from `t2` where ((`t2`.`key2` = 1) and ((`t2`.`key2_1` = 1) or (`t2`.`key3` = 5)))"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "((`t2`.`key2` = 1) and ((`t2`.`key2_1` = 1) or (`t2`.`key3` = 5)))",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "((multiple equal(1, `t2`.`key2_1`) or multiple equal(5, `t2`.`key3`)) and multiple equal(1, `t2`.`key2`))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "((multiple equal(1, `t2`.`key2_1`) or multiple equal(5, `t2`.`key3`)) and multiple equal(1, `t2`.`key2`))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "((multiple equal(1, `t2`.`key2_1`) or multiple equal(5, `t2`.`key3`)) and multiple equal(1, `t2`.`key2`))"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "field": "key2",
 | |
|                 "equals": "1",
 | |
|                 "null_rejecting": false
 | |
|               },
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "field": "key2",
 | |
|                 "equals": "1",
 | |
|                 "null_rejecting": false
 | |
|               }
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 1024,
 | |
|                     "cost": 106.56
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "PRIMARY",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i1b",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2_1",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key2",
 | |
|                         "key2_1"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2_2",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key2",
 | |
|                         "key2_1"
 | |
|                       ] /* key_parts */
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "setup_range_conditions": [
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "group_index_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "not_group_by_or_distinct"
 | |
|                   } /* group_index_range */,
 | |
|                   "skip_scan_range": {
 | |
|                     "potential_skip_scan_indexes": [
 | |
|                       {
 | |
|                         "index": "i2_1",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i2_2",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       }
 | |
|                     ] /* potential_skip_scan_indexes */
 | |
|                   } /* skip_scan_range */,
 | |
|                   "analyzing_range_alternatives": {
 | |
|                     "range_scan_alternatives": [
 | |
|                       {
 | |
|                         "index": "i2_1",
 | |
|                         "ranges": [
 | |
|                           "1 <= key2 <= 1"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": false,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 10,
 | |
|                         "cost": 3.76,
 | |
|                         "chosen": true
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i2_2",
 | |
|                         "ranges": [
 | |
|                           "1 <= key2 <= 1"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": false,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 10,
 | |
|                         "cost": 3.76,
 | |
|                         "chosen": false,
 | |
|                         "cause": "cost"
 | |
|                       }
 | |
|                     ] /* range_scan_alternatives */,
 | |
|                     "analyzing_roworder_intersect": {
 | |
|                       "usable": false,
 | |
|                       "cause": "too_few_roworder_scans"
 | |
|                     } /* analyzing_roworder_intersect */
 | |
|                   } /* analyzing_range_alternatives */,
 | |
|                   "chosen_range_access_summary": {
 | |
|                     "range_access_plan": {
 | |
|                       "type": "range_scan",
 | |
|                       "index": "i2_1",
 | |
|                       "rows": 10,
 | |
|                       "ranges": [
 | |
|                         "1 <= key2 <= 1"
 | |
|                       ] /* ranges */
 | |
|                     } /* range_access_plan */,
 | |
|                     "rows_for_plan": 10,
 | |
|                     "cost_for_plan": 3.76,
 | |
|                     "chosen": true
 | |
|                   } /* chosen_range_access_summary */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t2`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "access_type": "ref",
 | |
|                       "index": "i2_1",
 | |
|                       "rows": 10,
 | |
|                       "cost": 3.5,
 | |
|                       "chosen": true
 | |
|                     },
 | |
|                     {
 | |
|                       "access_type": "ref",
 | |
|                       "index": "i2_2",
 | |
|                       "rows": 10,
 | |
|                       "cost": 3.5,
 | |
|                       "chosen": false
 | |
|                     },
 | |
|                     {
 | |
|                       "access_type": "range",
 | |
|                       "range_details": {
 | |
|                         "used_index": "i2_1"
 | |
|                       } /* range_details */,
 | |
|                       "chosen": false,
 | |
|                       "cause": "heuristic_index_cheaper"
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 19,
 | |
|                 "rows_for_plan": 1.9,
 | |
|                 "cost_for_plan": 3.5,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "((`t2`.`key2` = 1) and ((`t2`.`key2_1` = 1) or (`t2`.`key3` = 5)))",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t2`",
 | |
|                   "attached": "((`t2`.`key2` = 1) and ((`t2`.`key2_1` = 1) or (`t2`.`key3` = 5)))"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "original_table_condition": "((`t2`.`key2` = 1) and ((`t2`.`key2_1` = 1) or (`t2`.`key3` = 5)))",
 | |
|                 "final_table_condition   ": "((`t2`.`key2_1` = 1) or (`t2`.`key3` = 5))"
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t2`"
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| 
 | |
| EXPLAIN SELECT * FROM t1 WHERE key2=10 OR key3=3 OR key4 <=> null;
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t1	NULL	index_merge	i2,i3,i4	i2,i3	4,4	NULL	2	100.00	Using union(i2,i3); Using where
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select `test`.`t1`.`key1` AS `key1`,`test`.`t1`.`key2` AS `key2`,`test`.`t1`.`key3` AS `key3`,`test`.`t1`.`key4` AS `key4`,`test`.`t1`.`key5` AS `key5`,`test`.`t1`.`key6` AS `key6`,`test`.`t1`.`key7` AS `key7`,`test`.`t1`.`key8` AS `key8` from `test`.`t1` where ((`test`.`t1`.`key2` = 10) or (`test`.`t1`.`key3` = 3) or (`test`.`t1`.`key4` <=> NULL))
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT * FROM t1 WHERE key2=10 OR key3=3 OR key4 <=> null	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select `t1`.`key1` AS `key1`,`t1`.`key2` AS `key2`,`t1`.`key3` AS `key3`,`t1`.`key4` AS `key4`,`t1`.`key5` AS `key5`,`t1`.`key6` AS `key6`,`t1`.`key7` AS `key7`,`t1`.`key8` AS `key8` from `t1` where ((`t1`.`key2` = 10) or (`t1`.`key3` = 3) or (`t1`.`key4` <=> NULL))"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "((`t1`.`key2` = 10) or (`t1`.`key3` = 3) or (`t1`.`key4` <=> NULL))",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "(multiple equal(10, `t1`.`key2`) or multiple equal(3, `t1`.`key3`) or (`t1`.`key4` <=> NULL))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "(multiple equal(10, `t1`.`key2`) or multiple equal(3, `t1`.`key3`) or (`t1`.`key4` <=> NULL))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "(multiple equal(10, `t1`.`key2`) or multiple equal(3, `t1`.`key3`) or (`t1`.`key4` <=> NULL))"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 1024,
 | |
|                     "cost": 107.06
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "i1",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key2"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i3",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key3"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i4",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key4"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i5",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i6",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i7",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i8",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "setup_range_conditions": [
 | |
|                     {
 | |
|                       "impossible_condition": {
 | |
|                         "cause": "null_field_in_non_null_column"
 | |
|                       } /* impossible_condition */
 | |
|                     }
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "group_index_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "not_group_by_or_distinct"
 | |
|                   } /* group_index_range */,
 | |
|                   "skip_scan_range": {
 | |
|                     "potential_skip_scan_indexes": [
 | |
|                       {
 | |
|                         "index": "i2",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i3",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i4",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       }
 | |
|                     ] /* potential_skip_scan_indexes */
 | |
|                   } /* skip_scan_range */,
 | |
|                   "analyzing_range_alternatives": {
 | |
|                     "range_scan_alternatives": [
 | |
|                     ] /* range_scan_alternatives */,
 | |
|                     "analyzing_roworder_intersect": {
 | |
|                       "usable": false,
 | |
|                       "cause": "too_few_roworder_scans"
 | |
|                     } /* analyzing_roworder_intersect */
 | |
|                   } /* analyzing_range_alternatives */,
 | |
|                   "analyzing_index_merge_union": [
 | |
|                     {
 | |
|                       "indexes_to_merge": [
 | |
|                         {
 | |
|                           "range_scan_alternatives": [
 | |
|                             {
 | |
|                               "index": "i2",
 | |
|                               "ranges": [
 | |
|                                 "10 <= key2 <= 10"
 | |
|                               ] /* ranges */,
 | |
|                               "index_dives_for_eq_ranges": true,
 | |
|                               "rowid_ordered": true,
 | |
|                               "using_mrr": false,
 | |
|                               "index_only": true,
 | |
|                               "rows": 1,
 | |
|                               "cost": 0.36,
 | |
|                               "chosen": true
 | |
|                             }
 | |
|                           ] /* range_scan_alternatives */,
 | |
|                           "index_to_merge": "i2",
 | |
|                           "cumulated_cost": 0.36
 | |
|                         },
 | |
|                         {
 | |
|                           "range_scan_alternatives": [
 | |
|                             {
 | |
|                               "index": "i3",
 | |
|                               "ranges": [
 | |
|                                 "3 <= key3 <= 3"
 | |
|                               ] /* ranges */,
 | |
|                               "index_dives_for_eq_ranges": true,
 | |
|                               "rowid_ordered": true,
 | |
|                               "using_mrr": false,
 | |
|                               "index_only": true,
 | |
|                               "rows": 1,
 | |
|                               "cost": 0.36,
 | |
|                               "chosen": true
 | |
|                             }
 | |
|                           ] /* range_scan_alternatives */,
 | |
|                           "index_to_merge": "i3",
 | |
|                           "cumulated_cost": 0.72
 | |
|                         }
 | |
|                       ] /* indexes_to_merge */,
 | |
|                       "cost_of_reading_ranges": 0.72,
 | |
|                       "use_roworder_union": true,
 | |
|                       "cause": "always_cheaper_than_not_roworder_retrieval",
 | |
|                       "analyzing_roworder_scans": [
 | |
|                         {
 | |
|                           "type": "range_scan",
 | |
|                           "index": "i2",
 | |
|                           "rows": 1,
 | |
|                           "ranges": [
 | |
|                             "10 <= key2 <= 10"
 | |
|                           ] /* ranges */,
 | |
|                           "analyzing_roworder_intersect": {
 | |
|                             "usable": false,
 | |
|                             "cause": "too_few_roworder_scans"
 | |
|                           } /* analyzing_roworder_intersect */
 | |
|                         },
 | |
|                         {
 | |
|                           "type": "range_scan",
 | |
|                           "index": "i3",
 | |
|                           "rows": 1,
 | |
|                           "ranges": [
 | |
|                             "3 <= key3 <= 3"
 | |
|                           ] /* ranges */,
 | |
|                           "analyzing_roworder_intersect": {
 | |
|                             "usable": false,
 | |
|                             "cause": "too_few_roworder_scans"
 | |
|                           } /* analyzing_roworder_intersect */
 | |
|                         }
 | |
|                       ] /* analyzing_roworder_scans */,
 | |
|                       "index_roworder_union_cost": 1.2922,
 | |
|                       "members": 2,
 | |
|                       "chosen": true
 | |
|                     }
 | |
|                   ] /* analyzing_index_merge_union */,
 | |
|                   "chosen_range_access_summary": {
 | |
|                     "range_access_plan": {
 | |
|                       "type": "index_roworder_union",
 | |
|                       "union_of": [
 | |
|                         {
 | |
|                           "type": "range_scan",
 | |
|                           "index": "i2",
 | |
|                           "rows": 1,
 | |
|                           "ranges": [
 | |
|                             "10 <= key2 <= 10"
 | |
|                           ] /* ranges */
 | |
|                         },
 | |
|                         {
 | |
|                           "type": "range_scan",
 | |
|                           "index": "i3",
 | |
|                           "rows": 1,
 | |
|                           "ranges": [
 | |
|                             "3 <= key3 <= 3"
 | |
|                           ] /* ranges */
 | |
|                         }
 | |
|                       ] /* union_of */
 | |
|                     } /* range_access_plan */,
 | |
|                     "rows_for_plan": 2,
 | |
|                     "cost_for_plan": 1.2922,
 | |
|                     "chosen": true
 | |
|                   } /* chosen_range_access_summary */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t1`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "rows_to_scan": 2,
 | |
|                       "filtering_effect": [
 | |
|                       ] /* filtering_effect */,
 | |
|                       "final_filtering_effect": 1,
 | |
|                       "access_type": "range",
 | |
|                       "range_details": {
 | |
|                         "used_index": "union(i2,i3)"
 | |
|                       } /* range_details */,
 | |
|                       "resulting_rows": 2,
 | |
|                       "cost": 1.4922,
 | |
|                       "chosen": true
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 2,
 | |
|                 "cost_for_plan": 1.4922,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "((`t1`.`key2` = 10) or (`t1`.`key3` = 3) or (`t1`.`key4` <=> NULL))",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t1`",
 | |
|                   "attached": "((`t1`.`key2` = 10) or (`t1`.`key3` = 3) or (`t1`.`key4` <=> NULL))"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "original_table_condition": "((`t1`.`key2` = 10) or (`t1`.`key3` = 3) or (`t1`.`key4` <=> NULL))",
 | |
|                 "final_table_condition   ": "((`t1`.`key2` = 10) or (`t1`.`key3` = 3) or (`t1`.`key4` <=> NULL))"
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t1`"
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| 
 | |
| EXPLAIN SELECT * FROM t2 WHERE key2_1 < 79 OR key2 = 2;
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t2	NULL	ALL	i2_1,i2_2	NULL	NULL	NULL	1024	33.98	Using where
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select `test`.`t2`.`key1a` AS `key1a`,`test`.`t2`.`key1b` AS `key1b`,`test`.`t2`.`key2` AS `key2`,`test`.`t2`.`key2_1` AS `key2_1`,`test`.`t2`.`key2_2` AS `key2_2`,`test`.`t2`.`key3` AS `key3` from `test`.`t2` where ((`test`.`t2`.`key2_1` < 79) or (`test`.`t2`.`key2` = 2))
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT * FROM t2 WHERE key2_1 < 79 OR key2 = 2	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select `t2`.`key1a` AS `key1a`,`t2`.`key1b` AS `key1b`,`t2`.`key2` AS `key2`,`t2`.`key2_1` AS `key2_1`,`t2`.`key2_2` AS `key2_2`,`t2`.`key3` AS `key3` from `t2` where ((`t2`.`key2_1` < 79) or (`t2`.`key2` = 2))"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "((`t2`.`key2_1` < 79) or (`t2`.`key2` = 2))",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "((`t2`.`key2_1` < 79) or multiple equal(2, `t2`.`key2`))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "((`t2`.`key2_1` < 79) or multiple equal(2, `t2`.`key2`))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "((`t2`.`key2_1` < 79) or multiple equal(2, `t2`.`key2`))"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 1024,
 | |
|                     "cost": 106.56
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "PRIMARY",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i1b",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2_1",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key2",
 | |
|                         "key2_1"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2_2",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key2",
 | |
|                         "key2_1"
 | |
|                       ] /* key_parts */
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "setup_range_conditions": [
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "range_scan_possible": false,
 | |
|                   "cause": "condition_always_true",
 | |
|                   "group_index_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "not_group_by_or_distinct"
 | |
|                   } /* group_index_range */,
 | |
|                   "skip_scan_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "disjuntive_predicate_present"
 | |
|                   } /* skip_scan_range */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t2`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "rows_to_scan": 1024,
 | |
|                       "filtering_effect": [
 | |
|                       ] /* filtering_effect */,
 | |
|                       "final_filtering_effect": 0.3398,
 | |
|                       "access_type": "scan",
 | |
|                       "resulting_rows": 347.97,
 | |
|                       "cost": 104.46,
 | |
|                       "chosen": true
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 347.97,
 | |
|                 "cost_for_plan": 104.46,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "((`t2`.`key2_1` < 79) or (`t2`.`key2` = 2))",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t2`",
 | |
|                   "attached": "((`t2`.`key2_1` < 79) or (`t2`.`key2` = 2))"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "original_table_condition": "((`t2`.`key2_1` < 79) or (`t2`.`key2` = 2))",
 | |
|                 "final_table_condition   ": "((`t2`.`key2_1` < 79) or (`t2`.`key2` = 2))"
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t2`"
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| 
 | |
| EXPLAIN SELECT * FROM t2 WHERE key1a = 5 and key1b < 10;
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t2	NULL	range	PRIMARY,i1b	PRIMARY	8	NULL	1	100.00	Using index condition
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select `test`.`t2`.`key1a` AS `key1a`,`test`.`t2`.`key1b` AS `key1b`,`test`.`t2`.`key2` AS `key2`,`test`.`t2`.`key2_1` AS `key2_1`,`test`.`t2`.`key2_2` AS `key2_2`,`test`.`t2`.`key3` AS `key3` from `test`.`t2` where ((`test`.`t2`.`key1a` = 5) and (`test`.`t2`.`key1b` < 10))
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT * FROM t2 WHERE key1a = 5 and key1b < 10	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select `t2`.`key1a` AS `key1a`,`t2`.`key1b` AS `key1b`,`t2`.`key2` AS `key2`,`t2`.`key2_1` AS `key2_1`,`t2`.`key2_2` AS `key2_2`,`t2`.`key3` AS `key3` from `t2` where ((`t2`.`key1a` = 5) and (`t2`.`key1b` < 10))"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "((`t2`.`key1a` = 5) and (`t2`.`key1b` < 10))",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "((`t2`.`key1b` < 10) and multiple equal(5, `t2`.`key1a`))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "((`t2`.`key1b` < 10) and multiple equal(5, `t2`.`key1a`))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "((`t2`.`key1b` < 10) and multiple equal(5, `t2`.`key1a`))"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "field": "key1a",
 | |
|                 "equals": "5",
 | |
|                 "null_rejecting": false
 | |
|               }
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 1024,
 | |
|                     "cost": 106.56
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "PRIMARY",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key1a",
 | |
|                         "key1b"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i1b",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key1b",
 | |
|                         "key1a"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2_1",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2_2",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "setup_range_conditions": [
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "group_index_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "not_group_by_or_distinct"
 | |
|                   } /* group_index_range */,
 | |
|                   "skip_scan_range": {
 | |
|                     "potential_skip_scan_indexes": [
 | |
|                       {
 | |
|                         "index": "PRIMARY",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i1b",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       }
 | |
|                     ] /* potential_skip_scan_indexes */
 | |
|                   } /* skip_scan_range */,
 | |
|                   "analyzing_range_alternatives": {
 | |
|                     "range_scan_alternatives": [
 | |
|                       {
 | |
|                         "index": "PRIMARY",
 | |
|                         "ranges": [
 | |
|                           "5 <= key1a <= 5 AND key1b < 10"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": false,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 1,
 | |
|                         "cost": 0.61,
 | |
|                         "chosen": true
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i1b",
 | |
|                         "ranges": [
 | |
|                           "key1b < 10"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": false,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 9,
 | |
|                         "cost": 3.41,
 | |
|                         "chosen": false,
 | |
|                         "cause": "cost"
 | |
|                       }
 | |
|                     ] /* range_scan_alternatives */,
 | |
|                     "analyzing_roworder_intersect": {
 | |
|                       "usable": false,
 | |
|                       "cause": "too_few_roworder_scans"
 | |
|                     } /* analyzing_roworder_intersect */
 | |
|                   } /* analyzing_range_alternatives */,
 | |
|                   "chosen_range_access_summary": {
 | |
|                     "range_access_plan": {
 | |
|                       "type": "range_scan",
 | |
|                       "index": "PRIMARY",
 | |
|                       "rows": 1,
 | |
|                       "ranges": [
 | |
|                         "5 <= key1a <= 5 AND key1b < 10"
 | |
|                       ] /* ranges */
 | |
|                     } /* range_access_plan */,
 | |
|                     "rows_for_plan": 1,
 | |
|                     "cost_for_plan": 0.61,
 | |
|                     "chosen": true
 | |
|                   } /* chosen_range_access_summary */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t2`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "access_type": "ref",
 | |
|                       "index": "PRIMARY",
 | |
|                       "rows": 10,
 | |
|                       "cost": 3.56,
 | |
|                       "chosen": true
 | |
|                     },
 | |
|                     {
 | |
|                       "rows_to_scan": 1,
 | |
|                       "filtering_effect": [
 | |
|                       ] /* filtering_effect */,
 | |
|                       "final_filtering_effect": 1,
 | |
|                       "access_type": "range",
 | |
|                       "range_details": {
 | |
|                         "used_index": "PRIMARY"
 | |
|                       } /* range_details */,
 | |
|                       "resulting_rows": 1,
 | |
|                       "cost": 0.71,
 | |
|                       "chosen": true
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 1,
 | |
|                 "cost_for_plan": 0.71,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "((`t2`.`key1a` = 5) and (`t2`.`key1b` < 10))",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t2`",
 | |
|                   "attached": "((`t2`.`key1a` = 5) and (`t2`.`key1b` < 10))"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "original_table_condition": "((`t2`.`key1a` = 5) and (`t2`.`key1b` < 10))",
 | |
|                 "final_table_condition   ": "((`t2`.`key1a` = 5) and (`t2`.`key1b` < 10))"
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "pushed_index_condition": "((`t2`.`key1a` = 5) and (`t2`.`key1b` < 10))",
 | |
|                 "table_condition_attached": null
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| 
 | |
| EXPLAIN SELECT * FROM t2 WHERE (key1a = 5 and key1b < 10 and key1b > 2) or
 | |
| (key1a = 4 and key1b < 7 and key1b > 3);
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t2	NULL	range	PRIMARY,i1b	PRIMARY	8	NULL	2	100.00	Using index condition
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select `test`.`t2`.`key1a` AS `key1a`,`test`.`t2`.`key1b` AS `key1b`,`test`.`t2`.`key2` AS `key2`,`test`.`t2`.`key2_1` AS `key2_1`,`test`.`t2`.`key2_2` AS `key2_2`,`test`.`t2`.`key3` AS `key3` from `test`.`t2` where (((`test`.`t2`.`key1a` = 5) and (`test`.`t2`.`key1b` < 10) and (`test`.`t2`.`key1b` > 2)) or ((`test`.`t2`.`key1a` = 4) and (`test`.`t2`.`key1b` < 7) and (`test`.`t2`.`key1b` > 3)))
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT * FROM t2 WHERE (key1a = 5 and key1b < 10 and key1b > 2) or
 | |
| (key1a = 4 and key1b < 7 and key1b > 3)	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select `t2`.`key1a` AS `key1a`,`t2`.`key1b` AS `key1b`,`t2`.`key2` AS `key2`,`t2`.`key2_1` AS `key2_1`,`t2`.`key2_2` AS `key2_2`,`t2`.`key3` AS `key3` from `t2` where (((`t2`.`key1a` = 5) and (`t2`.`key1b` < 10) and (`t2`.`key1b` > 2)) or ((`t2`.`key1a` = 4) and (`t2`.`key1b` < 7) and (`t2`.`key1b` > 3)))"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "(((`t2`.`key1a` = 5) and (`t2`.`key1b` < 10) and (`t2`.`key1b` > 2)) or ((`t2`.`key1a` = 4) and (`t2`.`key1b` < 7) and (`t2`.`key1b` > 3)))",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "(((`t2`.`key1b` < 10) and (`t2`.`key1b` > 2) and multiple equal(5, `t2`.`key1a`)) or ((`t2`.`key1b` < 7) and (`t2`.`key1b` > 3) and multiple equal(4, `t2`.`key1a`)))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "(((`t2`.`key1b` < 10) and (`t2`.`key1b` > 2) and multiple equal(5, `t2`.`key1a`)) or ((`t2`.`key1b` < 7) and (`t2`.`key1b` > 3) and multiple equal(4, `t2`.`key1a`)))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "(((`t2`.`key1b` < 10) and (`t2`.`key1b` > 2) and multiple equal(5, `t2`.`key1a`)) or ((`t2`.`key1b` < 7) and (`t2`.`key1b` > 3) and multiple equal(4, `t2`.`key1a`)))"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 1024,
 | |
|                     "cost": 106.56
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "PRIMARY",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key1a",
 | |
|                         "key1b"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i1b",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key1b",
 | |
|                         "key1a"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2_1",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2_2",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "setup_range_conditions": [
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "group_index_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "not_group_by_or_distinct"
 | |
|                   } /* group_index_range */,
 | |
|                   "skip_scan_range": {
 | |
|                     "potential_skip_scan_indexes": [
 | |
|                       {
 | |
|                         "index": "PRIMARY",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i1b",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       }
 | |
|                     ] /* potential_skip_scan_indexes */
 | |
|                   } /* skip_scan_range */,
 | |
|                   "analyzing_range_alternatives": {
 | |
|                     "range_scan_alternatives": [
 | |
|                       {
 | |
|                         "index": "PRIMARY",
 | |
|                         "ranges": [
 | |
|                           "4 <= key1a <= 4 AND 3 < key1b < 7",
 | |
|                           "5 <= key1a <= 5 AND 2 < key1b < 10"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": false,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 2,
 | |
|                         "cost": 1.21,
 | |
|                         "chosen": true
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i1b",
 | |
|                         "ranges": [
 | |
|                           "2 < key1b <= 3",
 | |
|                           "3 < key1b < 7",
 | |
|                           "7 <= key1b < 10"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": false,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 6,
 | |
|                         "cost": 2.86,
 | |
|                         "chosen": false,
 | |
|                         "cause": "cost"
 | |
|                       }
 | |
|                     ] /* range_scan_alternatives */,
 | |
|                     "analyzing_roworder_intersect": {
 | |
|                       "usable": false,
 | |
|                       "cause": "too_few_roworder_scans"
 | |
|                     } /* analyzing_roworder_intersect */
 | |
|                   } /* analyzing_range_alternatives */,
 | |
|                   "chosen_range_access_summary": {
 | |
|                     "range_access_plan": {
 | |
|                       "type": "range_scan",
 | |
|                       "index": "PRIMARY",
 | |
|                       "rows": 2,
 | |
|                       "ranges": [
 | |
|                         "4 <= key1a <= 4 AND 3 < key1b < 7",
 | |
|                         "5 <= key1a <= 5 AND 2 < key1b < 10"
 | |
|                       ] /* ranges */
 | |
|                     } /* range_access_plan */,
 | |
|                     "rows_for_plan": 2,
 | |
|                     "cost_for_plan": 1.21,
 | |
|                     "chosen": true
 | |
|                   } /* chosen_range_access_summary */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t2`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "rows_to_scan": 2,
 | |
|                       "filtering_effect": [
 | |
|                       ] /* filtering_effect */,
 | |
|                       "final_filtering_effect": 1,
 | |
|                       "access_type": "range",
 | |
|                       "range_details": {
 | |
|                         "used_index": "PRIMARY"
 | |
|                       } /* range_details */,
 | |
|                       "resulting_rows": 2,
 | |
|                       "cost": 1.41,
 | |
|                       "chosen": true
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 2,
 | |
|                 "cost_for_plan": 1.41,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "(((`t2`.`key1a` = 5) and (`t2`.`key1b` < 10) and (`t2`.`key1b` > 2)) or ((`t2`.`key1a` = 4) and (`t2`.`key1b` < 7) and (`t2`.`key1b` > 3)))",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t2`",
 | |
|                   "attached": "(((`t2`.`key1a` = 5) and (`t2`.`key1b` < 10) and (`t2`.`key1b` > 2)) or ((`t2`.`key1a` = 4) and (`t2`.`key1b` < 7) and (`t2`.`key1b` > 3)))"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "original_table_condition": "(((`t2`.`key1a` = 5) and (`t2`.`key1b` < 10) and (`t2`.`key1b` > 2)) or ((`t2`.`key1a` = 4) and (`t2`.`key1b` < 7) and (`t2`.`key1b` > 3)))",
 | |
|                 "final_table_condition   ": "(((`t2`.`key1a` = 5) and (`t2`.`key1b` < 10) and (`t2`.`key1b` > 2)) or ((`t2`.`key1a` = 4) and (`t2`.`key1b` < 7) and (`t2`.`key1b` > 3)))"
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "pushed_index_condition": "(((`t2`.`key1a` = 5) and (`t2`.`key1b` < 10) and (`t2`.`key1b` > 2)) or ((`t2`.`key1a` = 4) and (`t2`.`key1b` < 7) and (`t2`.`key1b` > 3)))",
 | |
|                 "table_condition_attached": null
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| 
 | |
| EXPLAIN SELECT * FROM t2 WHERE (key1b < 10 and key1b > 7) and 
 | |
| (key1a = 4 or key1a = 5);
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t2	NULL	range	PRIMARY,i1b	i1b	4	NULL	2	19.00	Using index condition
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select `test`.`t2`.`key1a` AS `key1a`,`test`.`t2`.`key1b` AS `key1b`,`test`.`t2`.`key2` AS `key2`,`test`.`t2`.`key2_1` AS `key2_1`,`test`.`t2`.`key2_2` AS `key2_2`,`test`.`t2`.`key3` AS `key3` from `test`.`t2` where ((`test`.`t2`.`key1b` < 10) and (`test`.`t2`.`key1b` > 7) and ((`test`.`t2`.`key1a` = 4) or (`test`.`t2`.`key1a` = 5)))
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT * FROM t2 WHERE (key1b < 10 and key1b > 7) and 
 | |
| (key1a = 4 or key1a = 5)	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select `t2`.`key1a` AS `key1a`,`t2`.`key1b` AS `key1b`,`t2`.`key2` AS `key2`,`t2`.`key2_1` AS `key2_1`,`t2`.`key2_2` AS `key2_2`,`t2`.`key3` AS `key3` from `t2` where ((`t2`.`key1b` < 10) and (`t2`.`key1b` > 7) and ((`t2`.`key1a` = 4) or (`t2`.`key1a` = 5)))"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "((`t2`.`key1b` < 10) and (`t2`.`key1b` > 7) and ((`t2`.`key1a` = 4) or (`t2`.`key1a` = 5)))",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "((`t2`.`key1b` < 10) and (`t2`.`key1b` > 7) and (multiple equal(4, `t2`.`key1a`) or multiple equal(5, `t2`.`key1a`)))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "((`t2`.`key1b` < 10) and (`t2`.`key1b` > 7) and (multiple equal(4, `t2`.`key1a`) or multiple equal(5, `t2`.`key1a`)))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "((`t2`.`key1b` < 10) and (`t2`.`key1b` > 7) and (multiple equal(4, `t2`.`key1a`) or multiple equal(5, `t2`.`key1a`)))"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 1024,
 | |
|                     "cost": 106.56
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "PRIMARY",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key1a",
 | |
|                         "key1b"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i1b",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key1b",
 | |
|                         "key1a"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2_1",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2_2",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "setup_range_conditions": [
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "group_index_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "not_group_by_or_distinct"
 | |
|                   } /* group_index_range */,
 | |
|                   "skip_scan_range": {
 | |
|                     "potential_skip_scan_indexes": [
 | |
|                       {
 | |
|                         "index": "PRIMARY",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i1b",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       }
 | |
|                     ] /* potential_skip_scan_indexes */
 | |
|                   } /* skip_scan_range */,
 | |
|                   "analyzing_range_alternatives": {
 | |
|                     "range_scan_alternatives": [
 | |
|                       {
 | |
|                         "index": "PRIMARY",
 | |
|                         "ranges": [
 | |
|                           "4 <= key1a <= 4 AND 7 < key1b < 10",
 | |
|                           "5 <= key1a <= 5 AND 7 < key1b < 10"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": false,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 2,
 | |
|                         "cost": 1.21,
 | |
|                         "chosen": true
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i1b",
 | |
|                         "ranges": [
 | |
|                           "7 < key1b < 10"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": false,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 2,
 | |
|                         "cost": 0.96,
 | |
|                         "chosen": true
 | |
|                       }
 | |
|                     ] /* range_scan_alternatives */,
 | |
|                     "analyzing_roworder_intersect": {
 | |
|                       "usable": false,
 | |
|                       "cause": "too_few_roworder_scans"
 | |
|                     } /* analyzing_roworder_intersect */
 | |
|                   } /* analyzing_range_alternatives */,
 | |
|                   "chosen_range_access_summary": {
 | |
|                     "range_access_plan": {
 | |
|                       "type": "range_scan",
 | |
|                       "index": "i1b",
 | |
|                       "rows": 2,
 | |
|                       "ranges": [
 | |
|                         "7 < key1b < 10"
 | |
|                       ] /* ranges */
 | |
|                     } /* range_access_plan */,
 | |
|                     "rows_for_plan": 2,
 | |
|                     "cost_for_plan": 0.96,
 | |
|                     "chosen": true
 | |
|                   } /* chosen_range_access_summary */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t2`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "rows_to_scan": 2,
 | |
|                       "filtering_effect": [
 | |
|                       ] /* filtering_effect */,
 | |
|                       "final_filtering_effect": 0.19,
 | |
|                       "access_type": "range",
 | |
|                       "range_details": {
 | |
|                         "used_index": "i1b"
 | |
|                       } /* range_details */,
 | |
|                       "resulting_rows": 0.38,
 | |
|                       "cost": 1.16,
 | |
|                       "chosen": true
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 0.38,
 | |
|                 "cost_for_plan": 1.16,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "((`t2`.`key1b` < 10) and (`t2`.`key1b` > 7) and ((`t2`.`key1a` = 4) or (`t2`.`key1a` = 5)))",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t2`",
 | |
|                   "attached": "((`t2`.`key1b` < 10) and (`t2`.`key1b` > 7) and ((`t2`.`key1a` = 4) or (`t2`.`key1a` = 5)))"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "original_table_condition": "((`t2`.`key1b` < 10) and (`t2`.`key1b` > 7) and ((`t2`.`key1a` = 4) or (`t2`.`key1a` = 5)))",
 | |
|                 "final_table_condition   ": "((`t2`.`key1b` < 10) and (`t2`.`key1b` > 7) and ((`t2`.`key1a` = 4) or (`t2`.`key1a` = 5)))"
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "pushed_index_condition": "((`t2`.`key1b` < 10) and (`t2`.`key1b` > 7) and ((`t2`.`key1a` = 4) or (`t2`.`key1a` = 5)))",
 | |
|                 "table_condition_attached": null
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| 
 | |
| EXPLAIN SELECT * FROM t1 WHERE (key1 > 1 OR key2  > 2);
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t1	NULL	ALL	i1,i2	NULL	NULL	NULL	1024	55.55	Using where
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select `test`.`t1`.`key1` AS `key1`,`test`.`t1`.`key2` AS `key2`,`test`.`t1`.`key3` AS `key3`,`test`.`t1`.`key4` AS `key4`,`test`.`t1`.`key5` AS `key5`,`test`.`t1`.`key6` AS `key6`,`test`.`t1`.`key7` AS `key7`,`test`.`t1`.`key8` AS `key8` from `test`.`t1` where ((`test`.`t1`.`key1` > 1) or (`test`.`t1`.`key2` > 2))
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT * FROM t1 WHERE (key1 > 1 OR key2  > 2)	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select `t1`.`key1` AS `key1`,`t1`.`key2` AS `key2`,`t1`.`key3` AS `key3`,`t1`.`key4` AS `key4`,`t1`.`key5` AS `key5`,`t1`.`key6` AS `key6`,`t1`.`key7` AS `key7`,`t1`.`key8` AS `key8` from `t1` where ((`t1`.`key1` > 1) or (`t1`.`key2` > 2))"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "((`t1`.`key1` > 1) or (`t1`.`key2` > 2))",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "((`t1`.`key1` > 1) or (`t1`.`key2` > 2))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "((`t1`.`key1` > 1) or (`t1`.`key2` > 2))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "((`t1`.`key1` > 1) or (`t1`.`key2` > 2))"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 1024,
 | |
|                     "cost": 107.06
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "i1",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key1"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key2"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i3",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i4",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i5",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i6",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i7",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i8",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "setup_range_conditions": [
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "group_index_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "not_group_by_or_distinct"
 | |
|                   } /* group_index_range */,
 | |
|                   "skip_scan_range": {
 | |
|                     "potential_skip_scan_indexes": [
 | |
|                       {
 | |
|                         "index": "i1",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i2",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       }
 | |
|                     ] /* potential_skip_scan_indexes */
 | |
|                   } /* skip_scan_range */,
 | |
|                   "analyzing_range_alternatives": {
 | |
|                     "range_scan_alternatives": [
 | |
|                     ] /* range_scan_alternatives */,
 | |
|                     "analyzing_roworder_intersect": {
 | |
|                       "usable": false,
 | |
|                       "cause": "too_few_roworder_scans"
 | |
|                     } /* analyzing_roworder_intersect */
 | |
|                   } /* analyzing_range_alternatives */,
 | |
|                   "analyzing_index_merge_union": [
 | |
|                     {
 | |
|                       "indexes_to_merge": [
 | |
|                         {
 | |
|                           "range_scan_alternatives": [
 | |
|                             {
 | |
|                               "index": "i1",
 | |
|                               "ranges": [
 | |
|                                 "1 < key1"
 | |
|                               ] /* ranges */,
 | |
|                               "index_dives_for_eq_ranges": true,
 | |
|                               "rowid_ordered": false,
 | |
|                               "using_mrr": false,
 | |
|                               "index_only": true,
 | |
|                               "rows": 1023,
 | |
|                               "cost": 108,
 | |
|                               "chosen": false,
 | |
|                               "cause": "cost"
 | |
|                             }
 | |
|                           ] /* range_scan_alternatives */,
 | |
|                           "chosen": false,
 | |
|                           "cause": "cost"
 | |
|                         },
 | |
|                         {
 | |
|                           "range_scan_alternatives": [
 | |
|                             {
 | |
|                               "index": "i2",
 | |
|                               "ranges": [
 | |
|                                 "2 < key2"
 | |
|                               ] /* ranges */,
 | |
|                               "index_dives_for_eq_ranges": true,
 | |
|                               "rowid_ordered": false,
 | |
|                               "using_mrr": false,
 | |
|                               "index_only": true,
 | |
|                               "rows": 1022,
 | |
|                               "cost": 107.89,
 | |
|                               "chosen": false,
 | |
|                               "cause": "cost"
 | |
|                             }
 | |
|                           ] /* range_scan_alternatives */,
 | |
|                           "chosen": false,
 | |
|                           "cause": "cost"
 | |
|                         }
 | |
|                       ] /* indexes_to_merge */,
 | |
|                       "cost_of_reading_ranges": 0,
 | |
|                       "chosen": false,
 | |
|                       "cause": "cost"
 | |
|                     }
 | |
|                   ] /* analyzing_index_merge_union */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t1`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "rows_to_scan": 1024,
 | |
|                       "filtering_effect": [
 | |
|                       ] /* filtering_effect */,
 | |
|                       "final_filtering_effect": 0.5555,
 | |
|                       "access_type": "scan",
 | |
|                       "resulting_rows": 568.84,
 | |
|                       "cost": 104.96,
 | |
|                       "chosen": true
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 568.84,
 | |
|                 "cost_for_plan": 104.96,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "((`t1`.`key1` > 1) or (`t1`.`key2` > 2))",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t1`",
 | |
|                   "attached": "((`t1`.`key1` > 1) or (`t1`.`key2` > 2))"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "original_table_condition": "((`t1`.`key1` > 1) or (`t1`.`key2` > 2))",
 | |
|                 "final_table_condition   ": "((`t1`.`key1` > 1) or (`t1`.`key2` > 2))"
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t1`"
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| 
 | |
| EXPLAIN SELECT STRAIGHT_JOIN * FROM t1, t2 
 | |
| WHERE t1.key1=t2.key1a AND t1.key2 > 1020;
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t1	NULL	range	i1,i2	i2	4	NULL	42	100.00	Using index condition
 | |
| 1	SIMPLE	t2	NULL	ref	PRIMARY	PRIMARY	4	test.t1.key1	10	100.00	NULL
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select straight_join `test`.`t1`.`key1` AS `key1`,`test`.`t1`.`key2` AS `key2`,`test`.`t1`.`key3` AS `key3`,`test`.`t1`.`key4` AS `key4`,`test`.`t1`.`key5` AS `key5`,`test`.`t1`.`key6` AS `key6`,`test`.`t1`.`key7` AS `key7`,`test`.`t1`.`key8` AS `key8`,`test`.`t2`.`key1a` AS `key1a`,`test`.`t2`.`key1b` AS `key1b`,`test`.`t2`.`key2` AS `key2`,`test`.`t2`.`key2_1` AS `key2_1`,`test`.`t2`.`key2_2` AS `key2_2`,`test`.`t2`.`key3` AS `key3` from `test`.`t1` join `test`.`t2` where ((`test`.`t2`.`key1a` = `test`.`t1`.`key1`) and (`test`.`t1`.`key2` > 1020))
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT STRAIGHT_JOIN * FROM t1, t2 
 | |
| WHERE t1.key1=t2.key1a AND t1.key2 > 1020	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select straight_join `t1`.`key1` AS `key1`,`t1`.`key2` AS `key2`,`t1`.`key3` AS `key3`,`t1`.`key4` AS `key4`,`t1`.`key5` AS `key5`,`t1`.`key6` AS `key6`,`t1`.`key7` AS `key7`,`t1`.`key8` AS `key8`,`t2`.`key1a` AS `key1a`,`t2`.`key1b` AS `key1b`,`t2`.`key2` AS `key2`,`t2`.`key2_1` AS `key2_1`,`t2`.`key2_2` AS `key2_2`,`t2`.`key3` AS `key3` from `t1` join `t2` where ((`t1`.`key1` = `t2`.`key1a`) and (`t1`.`key2` > 1020))"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "((`t1`.`key1` = `t2`.`key1a`) and (`t1`.`key2` > 1020))",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "((`t1`.`key2` > 1020) and multiple equal(`t1`.`key1`, `t2`.`key1a`))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "((`t1`.`key2` > 1020) and multiple equal(`t1`.`key1`, `t2`.`key1a`))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "((`t1`.`key2` > 1020) and multiple equal(`t1`.`key1`, `t2`.`key1a`))"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               },
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 1,
 | |
|                 "depends_on_map_bits": [
 | |
|                   0
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "field": "key1",
 | |
|                 "equals": "`t2`.`key1a`",
 | |
|                 "null_rejecting": false
 | |
|               },
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "field": "key1a",
 | |
|                 "equals": "`t1`.`key1`",
 | |
|                 "null_rejecting": false
 | |
|               }
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 1024,
 | |
|                     "cost": 107.06
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "i1",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i2",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "key2"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i3",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i4",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i5",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i6",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i7",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i8",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "setup_range_conditions": [
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "group_index_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "not_single_table"
 | |
|                   } /* group_index_range */,
 | |
|                   "skip_scan_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "not_single_table"
 | |
|                   } /* skip_scan_range */,
 | |
|                   "analyzing_range_alternatives": {
 | |
|                     "range_scan_alternatives": [
 | |
|                       {
 | |
|                         "index": "i2",
 | |
|                         "ranges": [
 | |
|                           "1020 < key2"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": false,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 42,
 | |
|                         "cost": 14.96,
 | |
|                         "chosen": true
 | |
|                       }
 | |
|                     ] /* range_scan_alternatives */,
 | |
|                     "analyzing_roworder_intersect": {
 | |
|                       "usable": false,
 | |
|                       "cause": "too_few_roworder_scans"
 | |
|                     } /* analyzing_roworder_intersect */
 | |
|                   } /* analyzing_range_alternatives */,
 | |
|                   "chosen_range_access_summary": {
 | |
|                     "range_access_plan": {
 | |
|                       "type": "range_scan",
 | |
|                       "index": "i2",
 | |
|                       "rows": 42,
 | |
|                       "ranges": [
 | |
|                         "1020 < key2"
 | |
|                       ] /* ranges */
 | |
|                     } /* range_access_plan */,
 | |
|                     "rows_for_plan": 42,
 | |
|                     "cost_for_plan": 14.96,
 | |
|                     "chosen": true
 | |
|                   } /* chosen_range_access_summary */
 | |
|                 } /* range_analysis */
 | |
|               },
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "table_scan": {
 | |
|                   "rows": 1024,
 | |
|                   "cost": 2.0625
 | |
|                 } /* table_scan */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t1`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "access_type": "ref",
 | |
|                       "index": "i1",
 | |
|                       "usable": false,
 | |
|                       "chosen": false
 | |
|                     },
 | |
|                     {
 | |
|                       "rows_to_scan": 42,
 | |
|                       "filtering_effect": [
 | |
|                       ] /* filtering_effect */,
 | |
|                       "final_filtering_effect": 1,
 | |
|                       "access_type": "range",
 | |
|                       "range_details": {
 | |
|                         "used_index": "i2"
 | |
|                       } /* range_details */,
 | |
|                       "resulting_rows": 42,
 | |
|                       "cost": 19.16,
 | |
|                       "chosen": true
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 42,
 | |
|                 "cost_for_plan": 19.16
 | |
|               },
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                   "`t1`"
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t2`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "access_type": "ref",
 | |
|                       "index": "PRIMARY",
 | |
|                       "rows": 10,
 | |
|                       "cost": 149.52,
 | |
|                       "chosen": true
 | |
|                     },
 | |
|                     {
 | |
|                       "rows_to_scan": 1024,
 | |
|                       "filtering_effect": [
 | |
|                       ] /* filtering_effect */,
 | |
|                       "final_filtering_effect": 1,
 | |
|                       "access_type": "scan",
 | |
|                       "using_join_cache": true,
 | |
|                       "buffers_needed": 1,
 | |
|                       "resulting_rows": 1024,
 | |
|                       "cost": 4302.9,
 | |
|                       "chosen": false
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 420,
 | |
|                 "cost_for_plan": 168.68
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "((`t2`.`key1a` = `t1`.`key1`) and (`t1`.`key2` > 1020))",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t1`",
 | |
|                   "attached": "(`t1`.`key2` > 1020)"
 | |
|                 },
 | |
|                 {
 | |
|                   "table": "`t2`",
 | |
|                   "attached": "(`t2`.`key1a` = `t1`.`key1`)"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "original_table_condition": "(`t1`.`key2` > 1020)",
 | |
|                 "final_table_condition   ": "(`t1`.`key2` > 1020)"
 | |
|               },
 | |
|               {
 | |
|                 "table": "`t2`",
 | |
|                 "original_table_condition": "(`t2`.`key1a` = `t1`.`key1`)",
 | |
|                 "final_table_condition   ": null
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "pushed_index_condition": "(`t1`.`key2` > 1020)",
 | |
|                 "table_condition_attached": null
 | |
|               },
 | |
|               {
 | |
|                 "table": "`t2`"
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| DROP TABLE t1,t2;
 | |
| CREATE TABLE t1 (
 | |
| cola char(3) not null, 
 | |
| colb char(3) not null,  
 | |
| filler char(200),
 | |
| key(cola), 
 | |
| key(colb)
 | |
| ) CHARSET utf8mb4;
 | |
| INSERT INTO t1 VALUES ('foo','bar', 'ZZ'),('fuz','baz', 'ZZ');
 | |
| Inserting records
 | |
| 
 | |
| EXPLAIN SELECT * FROM t1 WHERE cola = 'foo' AND colb = 'bar';
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t1	NULL	index_merge	cola,colb	cola,colb	12,12	NULL	29	100.00	Using intersect(cola,colb); Using where
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select `test`.`t1`.`cola` AS `cola`,`test`.`t1`.`colb` AS `colb`,`test`.`t1`.`filler` AS `filler` from `test`.`t1` where ((`test`.`t1`.`colb` = 'bar') and (`test`.`t1`.`cola` = 'foo'))
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT * FROM t1 WHERE cola = 'foo' AND colb = 'bar'	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select `t1`.`cola` AS `cola`,`t1`.`colb` AS `colb`,`t1`.`filler` AS `filler` from `t1` where ((`t1`.`cola` = 'foo') and (`t1`.`colb` = 'bar'))"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "((`t1`.`cola` = 'foo') and (`t1`.`colb` = 'bar'))",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "(multiple equal('foo', `t1`.`cola`) and multiple equal('bar', `t1`.`colb`))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "(multiple equal('foo', `t1`.`cola`) and multiple equal('bar', `t1`.`colb`))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "(multiple equal('foo', `t1`.`cola`) and multiple equal('bar', `t1`.`colb`))"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "field": "cola",
 | |
|                 "equals": "'foo'",
 | |
|                 "null_rejecting": false
 | |
|               },
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "field": "colb",
 | |
|                 "equals": "'bar'",
 | |
|                 "null_rejecting": false
 | |
|               }
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 8704,
 | |
|                     "cost": 1311.3
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "cola",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "cola"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "colb",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "colb"
 | |
|                       ] /* key_parts */
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "setup_range_conditions": [
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "group_index_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "not_group_by_or_distinct"
 | |
|                   } /* group_index_range */,
 | |
|                   "skip_scan_range": {
 | |
|                     "potential_skip_scan_indexes": [
 | |
|                       {
 | |
|                         "index": "cola",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "colb",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       }
 | |
|                     ] /* potential_skip_scan_indexes */
 | |
|                   } /* skip_scan_range */,
 | |
|                   "analyzing_range_alternatives": {
 | |
|                     "range_scan_alternatives": [
 | |
|                       {
 | |
|                         "index": "cola",
 | |
|                         "ranges": [
 | |
|                           "foo <= cola <= foo"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": true,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 504,
 | |
|                         "cost": 176.66,
 | |
|                         "chosen": true
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "colb",
 | |
|                         "ranges": [
 | |
|                           "bar <= colb <= bar"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": true,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 504,
 | |
|                         "cost": 176.66,
 | |
|                         "chosen": false,
 | |
|                         "cause": "cost"
 | |
|                       }
 | |
|                     ] /* range_scan_alternatives */,
 | |
|                     "analyzing_roworder_intersect": {
 | |
|                       "intersecting_indexes": [
 | |
|                         {
 | |
|                           "index": "cola",
 | |
|                           "index_scan_cost": 4.9074,
 | |
|                           "cumulated_index_scan_cost": 4.9074,
 | |
|                           "disk_sweep_cost": 109.54,
 | |
|                           "cumulated_total_cost": 114.45,
 | |
|                           "usable": true,
 | |
|                           "matching_rows_now": 504,
 | |
|                           "isect_covering_with_this_index": false,
 | |
|                           "chosen": true
 | |
|                         },
 | |
|                         {
 | |
|                           "index": "colb",
 | |
|                           "index_scan_cost": 4.9074,
 | |
|                           "cumulated_index_scan_cost": 9.8148,
 | |
|                           "disk_sweep_cost": 7.1924,
 | |
|                           "cumulated_total_cost": 17.007,
 | |
|                           "usable": true,
 | |
|                           "matching_rows_now": 29.184,
 | |
|                           "isect_covering_with_this_index": false,
 | |
|                           "chosen": true
 | |
|                         }
 | |
|                       ] /* intersecting_indexes */,
 | |
|                       "clustered_pk": {
 | |
|                         "clustered_pk_added_to_intersect": false,
 | |
|                         "cause": "no_clustered_pk_index"
 | |
|                       } /* clustered_pk */,
 | |
|                       "rows": 29,
 | |
|                       "cost": 17.007,
 | |
|                       "covering": false,
 | |
|                       "chosen": true
 | |
|                     } /* analyzing_roworder_intersect */
 | |
|                   } /* analyzing_range_alternatives */,
 | |
|                   "chosen_range_access_summary": {
 | |
|                     "range_access_plan": {
 | |
|                       "type": "index_roworder_intersect",
 | |
|                       "rows": 29,
 | |
|                       "cost": 17.007,
 | |
|                       "covering": false,
 | |
|                       "clustered_pk_scan": false,
 | |
|                       "intersect_of": [
 | |
|                         {
 | |
|                           "type": "range_scan",
 | |
|                           "index": "cola",
 | |
|                           "rows": 504,
 | |
|                           "ranges": [
 | |
|                             "foo <= cola <= foo"
 | |
|                           ] /* ranges */
 | |
|                         },
 | |
|                         {
 | |
|                           "type": "range_scan",
 | |
|                           "index": "colb",
 | |
|                           "rows": 504,
 | |
|                           "ranges": [
 | |
|                             "bar <= colb <= bar"
 | |
|                           ] /* ranges */
 | |
|                         }
 | |
|                       ] /* intersect_of */
 | |
|                     } /* range_access_plan */,
 | |
|                     "rows_for_plan": 29,
 | |
|                     "cost_for_plan": 17.007,
 | |
|                     "chosen": true
 | |
|                   } /* chosen_range_access_summary */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t1`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "access_type": "ref",
 | |
|                       "index": "cola",
 | |
|                       "rows": 504,
 | |
|                       "cost": 176.4,
 | |
|                       "chosen": true
 | |
|                     },
 | |
|                     {
 | |
|                       "access_type": "ref",
 | |
|                       "index": "colb",
 | |
|                       "rows": 504,
 | |
|                       "cost": 176.4,
 | |
|                       "chosen": false
 | |
|                     },
 | |
|                     {
 | |
|                       "rows_to_scan": 29,
 | |
|                       "filtering_effect": [
 | |
|                       ] /* filtering_effect */,
 | |
|                       "final_filtering_effect": 1,
 | |
|                       "access_type": "range",
 | |
|                       "range_details": {
 | |
|                         "used_index": "intersect(cola,colb)"
 | |
|                       } /* range_details */,
 | |
|                       "resulting_rows": 29,
 | |
|                       "cost": 19.907,
 | |
|                       "chosen": true
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 29,
 | |
|                 "cost_for_plan": 19.907,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "((`t1`.`colb` = 'bar') and (`t1`.`cola` = 'foo'))",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t1`",
 | |
|                   "attached": "((`t1`.`colb` = 'bar') and (`t1`.`cola` = 'foo'))"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "original_table_condition": "((`t1`.`colb` = 'bar') and (`t1`.`cola` = 'foo'))",
 | |
|                 "final_table_condition   ": "((`t1`.`colb` = 'bar') and (`t1`.`cola` = 'foo'))"
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t1`"
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| 
 | |
| EXPLAIN SELECT * FROM t1 WHERE cola = 'f\no';
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t1	NULL	ref	cola	cola	12	const	1	100.00	Using index condition
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select `test`.`t1`.`cola` AS `cola`,`test`.`t1`.`colb` AS `colb`,`test`.`t1`.`filler` AS `filler` from `test`.`t1` where (`test`.`t1`.`cola` = 'f\no')
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT * FROM t1 WHERE cola = 'f\no'	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select `t1`.`cola` AS `cola`,`t1`.`colb` AS `colb`,`t1`.`filler` AS `filler` from `t1` where (`t1`.`cola` = 'f\\no')"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "(`t1`.`cola` = 'f\\no')",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "multiple equal('f\\no', `t1`.`cola`)"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "multiple equal('f\\no', `t1`.`cola`)"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "multiple equal('f\\no', `t1`.`cola`)"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "field": "cola",
 | |
|                 "equals": "'f\\no'",
 | |
|                 "null_rejecting": false
 | |
|               }
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 8704,
 | |
|                     "cost": 1311.3
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "cola",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "cola"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "colb",
 | |
|                       "usable": false,
 | |
|                       "cause": "not_applicable"
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "setup_range_conditions": [
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "group_index_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "not_group_by_or_distinct"
 | |
|                   } /* group_index_range */,
 | |
|                   "skip_scan_range": {
 | |
|                     "potential_skip_scan_indexes": [
 | |
|                       {
 | |
|                         "index": "cola",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       }
 | |
|                     ] /* potential_skip_scan_indexes */
 | |
|                   } /* skip_scan_range */,
 | |
|                   "analyzing_range_alternatives": {
 | |
|                     "range_scan_alternatives": [
 | |
|                       {
 | |
|                         "index": "cola",
 | |
|                         "ranges": [
 | |
|                           "f\no <= cola <= f\no"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": true,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 1,
 | |
|                         "cost": 0.61,
 | |
|                         "chosen": true
 | |
|                       }
 | |
|                     ] /* range_scan_alternatives */,
 | |
|                     "analyzing_roworder_intersect": {
 | |
|                       "usable": false,
 | |
|                       "cause": "too_few_roworder_scans"
 | |
|                     } /* analyzing_roworder_intersect */
 | |
|                   } /* analyzing_range_alternatives */,
 | |
|                   "chosen_range_access_summary": {
 | |
|                     "range_access_plan": {
 | |
|                       "type": "range_scan",
 | |
|                       "index": "cola",
 | |
|                       "rows": 1,
 | |
|                       "ranges": [
 | |
|                         "f\no <= cola <= f\no"
 | |
|                       ] /* ranges */
 | |
|                     } /* range_access_plan */,
 | |
|                     "rows_for_plan": 1,
 | |
|                     "cost_for_plan": 0.61,
 | |
|                     "chosen": true
 | |
|                   } /* chosen_range_access_summary */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t1`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "access_type": "ref",
 | |
|                       "index": "cola",
 | |
|                       "rows": 1,
 | |
|                       "cost": 0.35,
 | |
|                       "chosen": true
 | |
|                     },
 | |
|                     {
 | |
|                       "access_type": "range",
 | |
|                       "range_details": {
 | |
|                         "used_index": "cola"
 | |
|                       } /* range_details */,
 | |
|                       "chosen": false,
 | |
|                       "cause": "heuristic_index_cheaper"
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 1,
 | |
|                 "cost_for_plan": 0.35,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "(`t1`.`cola` = 'f\\no')",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t1`",
 | |
|                   "attached": "(`t1`.`cola` = 'f\\no')"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "original_table_condition": "(`t1`.`cola` = 'f\\no')",
 | |
|                 "final_table_condition   ": "(`t1`.`cola` = 'f\\no')"
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "pushed_index_condition": "(`t1`.`cola` = 'f\\no')",
 | |
|                 "table_condition_attached": null
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| DROP TABLE t1;
 | |
| CREATE TABLE t1(c INT);
 | |
| INSERT INTO t1 VALUES (),();
 | |
| CREATE TABLE t2 (b INT, KEY(b));
 | |
| INSERT INTO t2 VALUES (),(),();
 | |
| SET optimizer_trace_features="greedy_search=off,dynamic_range=on";
 | |
| EXPLAIN SELECT 1 FROM 
 | |
| (SELECT 1 FROM t2,t1 WHERE b < c GROUP BY 1 LIMIT 1) AS d2;
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	PRIMARY	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	no matching row in const table
 | |
| 2	DERIVED	t1	NULL	ALL	NULL	NULL	NULL	NULL	2	100.00	NULL
 | |
| 2	DERIVED	t2	NULL	ALL	b	NULL	NULL	NULL	3	33.33	Range checked for each record (index map: 0x1)
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select 1 AS `1` from (/* select#2 */ select 1 AS `1` from `test`.`t2` join `test`.`t1` where (`test`.`t2`.`b` < `test`.`t1`.`c`) group by '' limit 1) `d2`
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT 1 FROM 
 | |
| (SELECT 1 FROM t2,t1 WHERE b < c GROUP BY 1 LIMIT 1) AS d2	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "join_preparation": {
 | |
|               "select#": 2,
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "expanded_query": "/* select#2 */ select 1 AS `1` from `t2` join `t1` where (`t2`.`b` < `t1`.`c`) group by '' limit 1"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* join_preparation */
 | |
|           },
 | |
|           {
 | |
|             "derived": {
 | |
|               "table": " `d2`",
 | |
|               "select#": 2,
 | |
|               "materialized": true
 | |
|             } /* derived */
 | |
|           },
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select 1 AS `1` from (/* select#2 */ select 1 AS `1` from `t2` join `t1` where (`t2`.`b` < `t1`.`c`) group by '' limit 1) `d2`"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "join_optimization": {
 | |
|               "select#": 2,
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "condition_processing": {
 | |
|                     "condition": "WHERE",
 | |
|                     "original_condition": "(`t2`.`b` < `t1`.`c`)",
 | |
|                     "steps": [
 | |
|                       {
 | |
|                         "transformation": "equality_propagation",
 | |
|                         "resulting_condition": "(`t2`.`b` < `t1`.`c`)"
 | |
|                       },
 | |
|                       {
 | |
|                         "transformation": "constant_propagation",
 | |
|                         "resulting_condition": "(`t2`.`b` < `t1`.`c`)"
 | |
|                       },
 | |
|                       {
 | |
|                         "transformation": "trivial_condition_removal",
 | |
|                         "resulting_condition": "(`t2`.`b` < `t1`.`c`)"
 | |
|                       }
 | |
|                     ] /* steps */
 | |
|                   } /* condition_processing */
 | |
|                 },
 | |
|                 {
 | |
|                   "substitute_generated_columns": {
 | |
|                   } /* substitute_generated_columns */
 | |
|                 },
 | |
|                 {
 | |
|                   "table_dependencies": [
 | |
|                     {
 | |
|                       "table": "`t2`",
 | |
|                       "row_may_be_null": false,
 | |
|                       "map_bit": 0,
 | |
|                       "depends_on_map_bits": [
 | |
|                       ] /* depends_on_map_bits */
 | |
|                     },
 | |
|                     {
 | |
|                       "table": "`t1`",
 | |
|                       "row_may_be_null": false,
 | |
|                       "map_bit": 1,
 | |
|                       "depends_on_map_bits": [
 | |
|                       ] /* depends_on_map_bits */
 | |
|                     }
 | |
|                   ] /* table_dependencies */
 | |
|                 },
 | |
|                 {
 | |
|                   "ref_optimizer_key_uses": [
 | |
|                   ] /* ref_optimizer_key_uses */
 | |
|                 },
 | |
|                 {
 | |
|                   "rows_estimation": [
 | |
|                     {
 | |
|                       "table": "`t2`",
 | |
|                       "table_scan": {
 | |
|                         "rows": 3,
 | |
|                         "cost": 0.5013
 | |
|                       } /* table_scan */
 | |
|                     },
 | |
|                     {
 | |
|                       "table": "`t1`",
 | |
|                       "table_scan": {
 | |
|                         "rows": 2,
 | |
|                         "cost": 0.5009
 | |
|                       } /* table_scan */
 | |
|                     }
 | |
|                   ] /* rows_estimation */
 | |
|                 },
 | |
|                 {
 | |
|                   "considered_execution_plans": "..."
 | |
|                 },
 | |
|                 {
 | |
|                   "attaching_conditions_to_tables": {
 | |
|                     "original_condition": "(`t2`.`b` < `t1`.`c`)",
 | |
|                     "attached_conditions_computation": [
 | |
|                       {
 | |
|                         "table": "`t2`",
 | |
|                         "rechecking_index_usage": {
 | |
|                           "recheck_reason": "not_first_table",
 | |
|                           "range_analysis": {
 | |
|                             "table_scan": {
 | |
|                               "rows": 3,
 | |
|                               "cost": 3.05
 | |
|                             } /* table_scan */,
 | |
|                             "potential_range_indexes": [
 | |
|                               {
 | |
|                                 "index": "b",
 | |
|                                 "usable": true,
 | |
|                                 "key_parts": [
 | |
|                                   "b"
 | |
|                                 ] /* key_parts */
 | |
|                               }
 | |
|                             ] /* potential_range_indexes */,
 | |
|                             "best_covering_index_scan": {
 | |
|                               "index": "b",
 | |
|                               "cost": 0.5616,
 | |
|                               "chosen": true
 | |
|                             } /* best_covering_index_scan */,
 | |
|                             "setup_range_conditions": [
 | |
|                             ] /* setup_range_conditions */,
 | |
|                             "group_index_range": {
 | |
|                               "chosen": false,
 | |
|                               "cause": "not_single_table"
 | |
|                             } /* group_index_range */,
 | |
|                             "skip_scan_range": {
 | |
|                               "chosen": false,
 | |
|                               "cause": "not_single_table"
 | |
|                             } /* skip_scan_range */,
 | |
|                             "analyzing_range_alternatives": {
 | |
|                               "range_scan_alternatives": [
 | |
|                                 {
 | |
|                                   "index": "b",
 | |
|                                   "chosen": false,
 | |
|                                   "cause": "depends_on_unread_values"
 | |
|                                 }
 | |
|                               ] /* range_scan_alternatives */,
 | |
|                               "analyzing_roworder_intersect": {
 | |
|                                 "usable": false,
 | |
|                                 "cause": "too_few_roworder_scans"
 | |
|                               } /* analyzing_roworder_intersect */
 | |
|                             } /* analyzing_range_alternatives */
 | |
|                           } /* range_analysis */
 | |
|                         } /* rechecking_index_usage */
 | |
|                       }
 | |
|                     ] /* attached_conditions_computation */,
 | |
|                     "attached_conditions_summary": [
 | |
|                       {
 | |
|                         "table": "`t1`",
 | |
|                         "attached": null
 | |
|                       },
 | |
|                       {
 | |
|                         "table": "`t2`",
 | |
|                         "attached": "(`t2`.`b` < `t1`.`c`)"
 | |
|                       }
 | |
|                     ] /* attached_conditions_summary */
 | |
|                   } /* attaching_conditions_to_tables */
 | |
|                 },
 | |
|                 {
 | |
|                   "optimizing_distinct_group_by_order_by": {
 | |
|                     "simplifying_group_by": {
 | |
|                       "original_clause": "''",
 | |
|                       "items": [
 | |
|                         {
 | |
|                           "item": "1",
 | |
|                           "uses_only_constant_tables": true
 | |
|                         }
 | |
|                       ] /* items */,
 | |
|                       "resulting_clause_is_simple": true,
 | |
|                       "resulting_clause": ""
 | |
|                     } /* simplifying_group_by */
 | |
|                   } /* optimizing_distinct_group_by_order_by */
 | |
|                 },
 | |
|                 {
 | |
|                   "finalizing_table_conditions": [
 | |
|                     {
 | |
|                       "table": "`t2`",
 | |
|                       "original_table_condition": "(`t2`.`b` < `t1`.`c`)",
 | |
|                       "final_table_condition   ": "(`t2`.`b` < `t1`.`c`)"
 | |
|                     }
 | |
|                   ] /* finalizing_table_conditions */
 | |
|                 },
 | |
|                 {
 | |
|                   "refine_plan": [
 | |
|                     {
 | |
|                       "table": "`t1`"
 | |
|                     },
 | |
|                     {
 | |
|                       "table": "`t2`"
 | |
|                     }
 | |
|                   ] /* refine_plan */
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* join_optimization */
 | |
|           },
 | |
|           {
 | |
|             "creating_tmp_table": {
 | |
|               "tmp_table_info": {
 | |
|                 "table": " `d2`",
 | |
|                 "columns": 1,
 | |
|                 "row_length": 5,
 | |
|                 "key_length": 0,
 | |
|                 "unique_constraint": false,
 | |
|                 "makes_grouped_rows": false,
 | |
|                 "cannot_insert_duplicates": false,
 | |
|                 "location": "TempTable"
 | |
|               } /* tmp_table_info */
 | |
|             } /* creating_tmp_table */
 | |
|           },
 | |
|           {
 | |
|             "join_execution": {
 | |
|               "select#": 2,
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "rows_estimation_per_outer_row": {
 | |
|                     "table": "`t2`",
 | |
|                     "range_analysis": {
 | |
|                       "table_scan": {
 | |
|                         "rows": 3,
 | |
|                         "cost": 2.9013
 | |
|                       } /* table_scan */,
 | |
|                       "potential_range_indexes": [
 | |
|                         {
 | |
|                           "index": "b",
 | |
|                           "usable": true,
 | |
|                           "key_parts": [
 | |
|                             "b"
 | |
|                           ] /* key_parts */
 | |
|                         }
 | |
|                       ] /* potential_range_indexes */,
 | |
|                       "best_covering_index_scan": {
 | |
|                         "index": "b",
 | |
|                         "cost": 0.5616,
 | |
|                         "chosen": true
 | |
|                       } /* best_covering_index_scan */,
 | |
|                       "setup_range_conditions": [
 | |
|                         {
 | |
|                           "impossible_condition": {
 | |
|                             "cause": "comparison_with_null_always_false"
 | |
|                           } /* impossible_condition */
 | |
|                         }
 | |
|                       ] /* setup_range_conditions */,
 | |
|                       "impossible_range": true
 | |
|                     } /* range_analysis */
 | |
|                   } /* rows_estimation_per_outer_row */
 | |
|                 },
 | |
|                 {
 | |
|                   "rows_estimation_per_outer_row": {
 | |
|                     "table": "`t2`",
 | |
|                     "range_analysis": {
 | |
|                       "table_scan": {
 | |
|                         "rows": 3,
 | |
|                         "cost": 2.9013
 | |
|                       } /* table_scan */,
 | |
|                       "potential_range_indexes": [
 | |
|                         {
 | |
|                           "index": "b",
 | |
|                           "usable": true,
 | |
|                           "key_parts": [
 | |
|                             "b"
 | |
|                           ] /* key_parts */
 | |
|                         }
 | |
|                       ] /* potential_range_indexes */,
 | |
|                       "best_covering_index_scan": {
 | |
|                         "index": "b",
 | |
|                         "cost": 0.5616,
 | |
|                         "chosen": true
 | |
|                       } /* best_covering_index_scan */,
 | |
|                       "setup_range_conditions": [
 | |
|                         {
 | |
|                           "impossible_condition": {
 | |
|                             "cause": "comparison_with_null_always_false"
 | |
|                           } /* impossible_condition */
 | |
|                         }
 | |
|                       ] /* setup_range_conditions */,
 | |
|                       "impossible_range": true
 | |
|                     } /* range_analysis */
 | |
|                   } /* rows_estimation_per_outer_row */
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* join_execution */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": " `d2`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": " `d2`",
 | |
|                 "rows": 1,
 | |
|                 "cost": 1,
 | |
|                 "table_type": "system",
 | |
|                 "empty": true
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           }
 | |
|         ] /* steps */,
 | |
|         "empty_result": {
 | |
|           "cause": "no matching row in const table"
 | |
|         } /* empty_result */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "join_explain": {
 | |
|               "select#": 2,
 | |
|               "steps": [
 | |
|               ] /* steps */
 | |
|             } /* join_explain */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| 
 | |
| SET optimizer_trace_features="greedy_search=off,dynamic_range=off";
 | |
| EXPLAIN SELECT 1 FROM 
 | |
| (SELECT 1 FROM t2,t1 WHERE b < c GROUP BY 1 LIMIT 1) AS d2;
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	PRIMARY	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	no matching row in const table
 | |
| 2	DERIVED	t1	NULL	ALL	NULL	NULL	NULL	NULL	2	100.00	NULL
 | |
| 2	DERIVED	t2	NULL	ALL	b	NULL	NULL	NULL	3	33.33	Range checked for each record (index map: 0x1)
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select 1 AS `1` from (/* select#2 */ select 1 AS `1` from `test`.`t2` join `test`.`t1` where (`test`.`t2`.`b` < `test`.`t1`.`c`) group by '' limit 1) `d2`
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT 1 FROM 
 | |
| (SELECT 1 FROM t2,t1 WHERE b < c GROUP BY 1 LIMIT 1) AS d2	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "join_preparation": {
 | |
|               "select#": 2,
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "expanded_query": "/* select#2 */ select 1 AS `1` from `t2` join `t1` where (`t2`.`b` < `t1`.`c`) group by '' limit 1"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* join_preparation */
 | |
|           },
 | |
|           {
 | |
|             "derived": {
 | |
|               "table": " `d2`",
 | |
|               "select#": 2,
 | |
|               "materialized": true
 | |
|             } /* derived */
 | |
|           },
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select 1 AS `1` from (/* select#2 */ select 1 AS `1` from `t2` join `t1` where (`t2`.`b` < `t1`.`c`) group by '' limit 1) `d2`"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "join_optimization": {
 | |
|               "select#": 2,
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "condition_processing": {
 | |
|                     "condition": "WHERE",
 | |
|                     "original_condition": "(`t2`.`b` < `t1`.`c`)",
 | |
|                     "steps": [
 | |
|                       {
 | |
|                         "transformation": "equality_propagation",
 | |
|                         "resulting_condition": "(`t2`.`b` < `t1`.`c`)"
 | |
|                       },
 | |
|                       {
 | |
|                         "transformation": "constant_propagation",
 | |
|                         "resulting_condition": "(`t2`.`b` < `t1`.`c`)"
 | |
|                       },
 | |
|                       {
 | |
|                         "transformation": "trivial_condition_removal",
 | |
|                         "resulting_condition": "(`t2`.`b` < `t1`.`c`)"
 | |
|                       }
 | |
|                     ] /* steps */
 | |
|                   } /* condition_processing */
 | |
|                 },
 | |
|                 {
 | |
|                   "substitute_generated_columns": {
 | |
|                   } /* substitute_generated_columns */
 | |
|                 },
 | |
|                 {
 | |
|                   "table_dependencies": [
 | |
|                     {
 | |
|                       "table": "`t2`",
 | |
|                       "row_may_be_null": false,
 | |
|                       "map_bit": 0,
 | |
|                       "depends_on_map_bits": [
 | |
|                       ] /* depends_on_map_bits */
 | |
|                     },
 | |
|                     {
 | |
|                       "table": "`t1`",
 | |
|                       "row_may_be_null": false,
 | |
|                       "map_bit": 1,
 | |
|                       "depends_on_map_bits": [
 | |
|                       ] /* depends_on_map_bits */
 | |
|                     }
 | |
|                   ] /* table_dependencies */
 | |
|                 },
 | |
|                 {
 | |
|                   "ref_optimizer_key_uses": [
 | |
|                   ] /* ref_optimizer_key_uses */
 | |
|                 },
 | |
|                 {
 | |
|                   "rows_estimation": [
 | |
|                     {
 | |
|                       "table": "`t2`",
 | |
|                       "table_scan": {
 | |
|                         "rows": 3,
 | |
|                         "cost": 0.5013
 | |
|                       } /* table_scan */
 | |
|                     },
 | |
|                     {
 | |
|                       "table": "`t1`",
 | |
|                       "table_scan": {
 | |
|                         "rows": 2,
 | |
|                         "cost": 0.5009
 | |
|                       } /* table_scan */
 | |
|                     }
 | |
|                   ] /* rows_estimation */
 | |
|                 },
 | |
|                 {
 | |
|                   "considered_execution_plans": "..."
 | |
|                 },
 | |
|                 {
 | |
|                   "attaching_conditions_to_tables": {
 | |
|                     "original_condition": "(`t2`.`b` < `t1`.`c`)",
 | |
|                     "attached_conditions_computation": [
 | |
|                       {
 | |
|                         "table": "`t2`",
 | |
|                         "rechecking_index_usage": {
 | |
|                           "recheck_reason": "not_first_table",
 | |
|                           "range_analysis": {
 | |
|                             "table_scan": {
 | |
|                               "rows": 3,
 | |
|                               "cost": 3.05
 | |
|                             } /* table_scan */,
 | |
|                             "potential_range_indexes": [
 | |
|                               {
 | |
|                                 "index": "b",
 | |
|                                 "usable": true,
 | |
|                                 "key_parts": [
 | |
|                                   "b"
 | |
|                                 ] /* key_parts */
 | |
|                               }
 | |
|                             ] /* potential_range_indexes */,
 | |
|                             "best_covering_index_scan": {
 | |
|                               "index": "b",
 | |
|                               "cost": 0.5616,
 | |
|                               "chosen": true
 | |
|                             } /* best_covering_index_scan */,
 | |
|                             "setup_range_conditions": [
 | |
|                             ] /* setup_range_conditions */,
 | |
|                             "group_index_range": {
 | |
|                               "chosen": false,
 | |
|                               "cause": "not_single_table"
 | |
|                             } /* group_index_range */,
 | |
|                             "skip_scan_range": {
 | |
|                               "chosen": false,
 | |
|                               "cause": "not_single_table"
 | |
|                             } /* skip_scan_range */,
 | |
|                             "analyzing_range_alternatives": {
 | |
|                               "range_scan_alternatives": [
 | |
|                                 {
 | |
|                                   "index": "b",
 | |
|                                   "chosen": false,
 | |
|                                   "cause": "depends_on_unread_values"
 | |
|                                 }
 | |
|                               ] /* range_scan_alternatives */,
 | |
|                               "analyzing_roworder_intersect": {
 | |
|                                 "usable": false,
 | |
|                                 "cause": "too_few_roworder_scans"
 | |
|                               } /* analyzing_roworder_intersect */
 | |
|                             } /* analyzing_range_alternatives */
 | |
|                           } /* range_analysis */
 | |
|                         } /* rechecking_index_usage */
 | |
|                       }
 | |
|                     ] /* attached_conditions_computation */,
 | |
|                     "attached_conditions_summary": [
 | |
|                       {
 | |
|                         "table": "`t1`",
 | |
|                         "attached": null
 | |
|                       },
 | |
|                       {
 | |
|                         "table": "`t2`",
 | |
|                         "attached": "(`t2`.`b` < `t1`.`c`)"
 | |
|                       }
 | |
|                     ] /* attached_conditions_summary */
 | |
|                   } /* attaching_conditions_to_tables */
 | |
|                 },
 | |
|                 {
 | |
|                   "optimizing_distinct_group_by_order_by": {
 | |
|                     "simplifying_group_by": {
 | |
|                       "original_clause": "''",
 | |
|                       "items": [
 | |
|                         {
 | |
|                           "item": "1",
 | |
|                           "uses_only_constant_tables": true
 | |
|                         }
 | |
|                       ] /* items */,
 | |
|                       "resulting_clause_is_simple": true,
 | |
|                       "resulting_clause": ""
 | |
|                     } /* simplifying_group_by */
 | |
|                   } /* optimizing_distinct_group_by_order_by */
 | |
|                 },
 | |
|                 {
 | |
|                   "finalizing_table_conditions": [
 | |
|                     {
 | |
|                       "table": "`t2`",
 | |
|                       "original_table_condition": "(`t2`.`b` < `t1`.`c`)",
 | |
|                       "final_table_condition   ": "(`t2`.`b` < `t1`.`c`)"
 | |
|                     }
 | |
|                   ] /* finalizing_table_conditions */
 | |
|                 },
 | |
|                 {
 | |
|                   "refine_plan": [
 | |
|                     {
 | |
|                       "table": "`t1`"
 | |
|                     },
 | |
|                     {
 | |
|                       "table": "`t2`"
 | |
|                     }
 | |
|                   ] /* refine_plan */
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* join_optimization */
 | |
|           },
 | |
|           {
 | |
|             "creating_tmp_table": {
 | |
|               "tmp_table_info": {
 | |
|                 "table": " `d2`",
 | |
|                 "columns": 1,
 | |
|                 "row_length": 5,
 | |
|                 "key_length": 0,
 | |
|                 "unique_constraint": false,
 | |
|                 "makes_grouped_rows": false,
 | |
|                 "cannot_insert_duplicates": false,
 | |
|                 "location": "TempTable"
 | |
|               } /* tmp_table_info */
 | |
|             } /* creating_tmp_table */
 | |
|           },
 | |
|           {
 | |
|             "join_execution": {
 | |
|               "select#": 2,
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "rows_estimation_per_outer_row": {
 | |
|                     "table": "`t2`",
 | |
|                     "range_analysis": {
 | |
|                       "table_scan": {
 | |
|                         "rows": 3,
 | |
|                         "cost": 2.9013
 | |
|                       } /* table_scan */,
 | |
|                       "potential_range_indexes": [
 | |
|                         {
 | |
|                           "index": "b",
 | |
|                           "usable": true,
 | |
|                           "key_parts": [
 | |
|                             "b"
 | |
|                           ] /* key_parts */
 | |
|                         }
 | |
|                       ] /* potential_range_indexes */,
 | |
|                       "best_covering_index_scan": {
 | |
|                         "index": "b",
 | |
|                         "cost": 0.5616,
 | |
|                         "chosen": true
 | |
|                       } /* best_covering_index_scan */,
 | |
|                       "setup_range_conditions": [
 | |
|                         {
 | |
|                           "impossible_condition": {
 | |
|                             "cause": "comparison_with_null_always_false"
 | |
|                           } /* impossible_condition */
 | |
|                         }
 | |
|                       ] /* setup_range_conditions */,
 | |
|                       "impossible_range": true
 | |
|                     } /* range_analysis */
 | |
|                   } /* rows_estimation_per_outer_row */
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* join_execution */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": " `d2`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": " `d2`",
 | |
|                 "rows": 1,
 | |
|                 "cost": 1,
 | |
|                 "table_type": "system",
 | |
|                 "empty": true
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           }
 | |
|         ] /* steps */,
 | |
|         "empty_result": {
 | |
|           "cause": "no matching row in const table"
 | |
|         } /* empty_result */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "join_explain": {
 | |
|               "select#": 2,
 | |
|               "steps": [
 | |
|               ] /* steps */
 | |
|             } /* join_explain */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| 
 | |
| DROP TABLE t1,t2;
 | |
| SET optimizer_trace_features=default;
 | |
| CREATE TABLE t1 (
 | |
| i1 int,
 | |
| i2 int,
 | |
| c char(1),
 | |
| KEY k1 (i1),
 | |
| KEY k2 (i1, i2)
 | |
| ) CHARSET utf8mb4;
 | |
| INSERT INTO t1 VALUES (0,1,'2'),(3,2,'1');
 | |
| EXPLAIN SELECT * FROM t1 WHERE i1 > '2' ORDER BY i1, i2;
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t1	NULL	range	k1,k2	k2	5	NULL	2	100.00	Using index condition
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select `test`.`t1`.`i1` AS `i1`,`test`.`t1`.`i2` AS `i2`,`test`.`t1`.`c` AS `c` from `test`.`t1` where (`test`.`t1`.`i1` > 2) order by `test`.`t1`.`i1`,`test`.`t1`.`i2`
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT * FROM t1 WHERE i1 > '2' ORDER BY i1, i2	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select `t1`.`i1` AS `i1`,`t1`.`i2` AS `i2`,`t1`.`c` AS `c` from `t1` where (`t1`.`i1` > '2') order by `t1`.`i1`,`t1`.`i2`"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "(`t1`.`i1` > '2')",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "(`t1`.`i1` > '2')"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "(`t1`.`i1` > '2')"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "(`t1`.`i1` > 2)"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 2,
 | |
|                     "cost": 2.8016
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "k1",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "i1"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "k2",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "i1",
 | |
|                         "i2"
 | |
|                       ] /* key_parts */
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "setup_range_conditions": [
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "group_index_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "not_group_by_or_distinct"
 | |
|                   } /* group_index_range */,
 | |
|                   "skip_scan_range": {
 | |
|                     "potential_skip_scan_indexes": [
 | |
|                       {
 | |
|                         "index": "k1",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "k2",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       }
 | |
|                     ] /* potential_skip_scan_indexes */
 | |
|                   } /* skip_scan_range */,
 | |
|                   "analyzing_range_alternatives": {
 | |
|                     "range_scan_alternatives": [
 | |
|                       {
 | |
|                         "index": "k1",
 | |
|                         "ranges": [
 | |
|                           "2 < i1"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": false,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 2,
 | |
|                         "cost": 0.96,
 | |
|                         "chosen": true
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "k2",
 | |
|                         "ranges": [
 | |
|                           "2 < i1"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": false,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 2,
 | |
|                         "cost": 0.96,
 | |
|                         "chosen": false,
 | |
|                         "cause": "cost"
 | |
|                       }
 | |
|                     ] /* range_scan_alternatives */,
 | |
|                     "analyzing_roworder_intersect": {
 | |
|                       "usable": false,
 | |
|                       "cause": "too_few_roworder_scans"
 | |
|                     } /* analyzing_roworder_intersect */
 | |
|                   } /* analyzing_range_alternatives */,
 | |
|                   "chosen_range_access_summary": {
 | |
|                     "range_access_plan": {
 | |
|                       "type": "range_scan",
 | |
|                       "index": "k1",
 | |
|                       "rows": 2,
 | |
|                       "ranges": [
 | |
|                         "2 < i1"
 | |
|                       ] /* ranges */
 | |
|                     } /* range_access_plan */,
 | |
|                     "rows_for_plan": 2,
 | |
|                     "cost_for_plan": 0.96,
 | |
|                     "chosen": true
 | |
|                   } /* chosen_range_access_summary */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t1`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "rows_to_scan": 2,
 | |
|                       "filtering_effect": [
 | |
|                       ] /* filtering_effect */,
 | |
|                       "final_filtering_effect": 1,
 | |
|                       "access_type": "range",
 | |
|                       "range_details": {
 | |
|                         "used_index": "k1"
 | |
|                       } /* range_details */,
 | |
|                       "resulting_rows": 2,
 | |
|                       "cost": 1.16,
 | |
|                       "chosen": true,
 | |
|                       "use_tmp_table": true
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 2,
 | |
|                 "cost_for_plan": 1.16,
 | |
|                 "sort_cost": 2,
 | |
|                 "new_cost_for_plan": 3.16,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "(`t1`.`i1` > 2)",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t1`",
 | |
|                   "attached": "(`t1`.`i1` > 2)"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "optimizing_distinct_group_by_order_by": {
 | |
|               "simplifying_order_by": {
 | |
|                 "original_clause": "`t1`.`i1`,`t1`.`i2`",
 | |
|                 "items": [
 | |
|                   {
 | |
|                     "item": "`t1`.`i1`"
 | |
|                   },
 | |
|                   {
 | |
|                     "item": "`t1`.`i2`"
 | |
|                   }
 | |
|                 ] /* items */,
 | |
|                 "resulting_clause_is_simple": true,
 | |
|                 "resulting_clause": "`t1`.`i1`,`t1`.`i2`"
 | |
|               } /* simplifying_order_by */
 | |
|             } /* optimizing_distinct_group_by_order_by */
 | |
|           },
 | |
|           {
 | |
|             "reconsidering_access_paths_for_index_ordering": {
 | |
|               "clause": "ORDER BY",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "rows_estimation": {
 | |
|                     "table": "`t1`",
 | |
|                     "index": "k2",
 | |
|                     "range_analysis": {
 | |
|                       "table_scan": {
 | |
|                         "rows": 2,
 | |
|                         "cost": 2.8016
 | |
|                       } /* table_scan */,
 | |
|                       "potential_range_indexes": [
 | |
|                         {
 | |
|                           "index": "k1",
 | |
|                           "usable": false,
 | |
|                           "cause": "not_applicable"
 | |
|                         },
 | |
|                         {
 | |
|                           "index": "k2",
 | |
|                           "usable": true,
 | |
|                           "key_parts": [
 | |
|                             "i1",
 | |
|                             "i2"
 | |
|                           ] /* key_parts */
 | |
|                         }
 | |
|                       ] /* potential_range_indexes */,
 | |
|                       "setup_range_conditions": [
 | |
|                       ] /* setup_range_conditions */,
 | |
|                       "group_index_range": {
 | |
|                         "chosen": false,
 | |
|                         "cause": "not_group_by_or_distinct"
 | |
|                       } /* group_index_range */,
 | |
|                       "skip_scan_range": {
 | |
|                         "potential_skip_scan_indexes": [
 | |
|                           {
 | |
|                             "index": "k2",
 | |
|                             "usable": false,
 | |
|                             "cause": "query_references_nonkey_column"
 | |
|                           }
 | |
|                         ] /* potential_skip_scan_indexes */
 | |
|                       } /* skip_scan_range */,
 | |
|                       "analyzing_range_alternatives": {
 | |
|                         "range_scan_alternatives": [
 | |
|                           {
 | |
|                             "index": "k2",
 | |
|                             "ranges": [
 | |
|                               "2 < i1"
 | |
|                             ] /* ranges */,
 | |
|                             "index_dives_for_eq_ranges": true,
 | |
|                             "rowid_ordered": false,
 | |
|                             "using_mrr": false,
 | |
|                             "index_only": false,
 | |
|                             "rows": 2,
 | |
|                             "cost": 0.96,
 | |
|                             "chosen": true
 | |
|                           }
 | |
|                         ] /* range_scan_alternatives */,
 | |
|                         "analyzing_roworder_intersect": {
 | |
|                           "usable": false,
 | |
|                           "cause": "too_few_roworder_scans"
 | |
|                         } /* analyzing_roworder_intersect */
 | |
|                       } /* analyzing_range_alternatives */,
 | |
|                       "chosen_range_access_summary": {
 | |
|                         "range_access_plan": {
 | |
|                           "type": "range_scan",
 | |
|                           "index": "k2",
 | |
|                           "rows": 2,
 | |
|                           "ranges": [
 | |
|                             "2 < i1"
 | |
|                           ] /* ranges */
 | |
|                         } /* range_access_plan */,
 | |
|                         "rows_for_plan": 2,
 | |
|                         "cost_for_plan": 0.96,
 | |
|                         "chosen": true
 | |
|                       } /* chosen_range_access_summary */
 | |
|                     } /* range_analysis */
 | |
|                   } /* rows_estimation */
 | |
|                 }
 | |
|               ] /* steps */,
 | |
|               "index_order_summary": {
 | |
|                 "table": "`t1`",
 | |
|                 "index_provides_order": true,
 | |
|                 "order_direction": "asc",
 | |
|                 "index": "k2",
 | |
|                 "plan_changed": true,
 | |
|                 "access_type": "range"
 | |
|               } /* index_order_summary */
 | |
|             } /* reconsidering_access_paths_for_index_ordering */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "original_table_condition": "(`t1`.`i1` > 2)",
 | |
|                 "final_table_condition   ": "(`t1`.`i1` > 2)"
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "pushed_index_condition": "(`t1`.`i1` > 2)",
 | |
|                 "table_condition_attached": null
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           },
 | |
|           {
 | |
|             "considering_tmp_tables": [
 | |
|             ] /* considering_tmp_tables */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| 
 | |
| EXPLAIN SELECT DISTINCT i1 FROM t1 WHERE i1 >= '1' ORDER BY i1 DESC;
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t1	NULL	index	k1,k2	k1	5	NULL	2	100.00	Using where; Backward index scan; Using index
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select distinct `test`.`t1`.`i1` AS `i1` from `test`.`t1` where (`test`.`t1`.`i1` >= 1) order by `test`.`t1`.`i1` desc
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT DISTINCT i1 FROM t1 WHERE i1 >= '1' ORDER BY i1 DESC	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select distinct `t1`.`i1` AS `i1` from `t1` where (`t1`.`i1` >= '1') order by `t1`.`i1` desc"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "(`t1`.`i1` >= '1')",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "(`t1`.`i1` >= '1')"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "(`t1`.`i1` >= '1')"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "(`t1`.`i1` >= 1)"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 2,
 | |
|                     "cost": 2.8016
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "k1",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "i1"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "k2",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "i1",
 | |
|                         "i2"
 | |
|                       ] /* key_parts */
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "best_covering_index_scan": {
 | |
|                     "index": "k1",
 | |
|                     "cost": 0.4558,
 | |
|                     "chosen": true
 | |
|                   } /* best_covering_index_scan */,
 | |
|                   "setup_range_conditions": [
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "group_index_range": {
 | |
|                     "distinct_query": true,
 | |
|                     "potential_group_range_indexes": [
 | |
|                       {
 | |
|                         "index": "k1",
 | |
|                         "covering": true,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "ranges": [
 | |
|                           "1 <= i1"
 | |
|                         ] /* ranges */,
 | |
|                         "rows": 3,
 | |
|                         "cost": 0.7
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "k2",
 | |
|                         "covering": true,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "ranges": [
 | |
|                           "1 <= i1"
 | |
|                         ] /* ranges */,
 | |
|                         "rows": 3,
 | |
|                         "cost": 0.7
 | |
|                       }
 | |
|                     ] /* potential_group_range_indexes */
 | |
|                   } /* group_index_range */,
 | |
|                   "best_group_range_summary": {
 | |
|                     "type": "index_group",
 | |
|                     "index": "k1",
 | |
|                     "group_attribute": null,
 | |
|                     "min_aggregate": false,
 | |
|                     "max_aggregate": false,
 | |
|                     "distinct_aggregate": false,
 | |
|                     "rows": 3,
 | |
|                     "cost": 0.7,
 | |
|                     "key_parts_used_for_access": [
 | |
|                       "i1"
 | |
|                     ] /* key_parts_used_for_access */,
 | |
|                     "ranges": [
 | |
|                       "1 <= i1"
 | |
|                     ] /* ranges */,
 | |
|                     "chosen": false,
 | |
|                     "cause": "cost"
 | |
|                   } /* best_group_range_summary */,
 | |
|                   "skip_scan_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "has_select_distinct"
 | |
|                   } /* skip_scan_range */,
 | |
|                   "analyzing_range_alternatives": {
 | |
|                     "range_scan_alternatives": [
 | |
|                       {
 | |
|                         "index": "k1",
 | |
|                         "ranges": [
 | |
|                           "1 <= i1"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": false,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": true,
 | |
|                         "rows": 2,
 | |
|                         "cost": 0.4658,
 | |
|                         "chosen": false,
 | |
|                         "cause": "cost"
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "k2",
 | |
|                         "ranges": [
 | |
|                           "1 <= i1"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": false,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": true,
 | |
|                         "rows": 2,
 | |
|                         "cost": 0.4681,
 | |
|                         "chosen": false,
 | |
|                         "cause": "cost"
 | |
|                       }
 | |
|                     ] /* range_scan_alternatives */,
 | |
|                     "analyzing_roworder_intersect": {
 | |
|                       "usable": false,
 | |
|                       "cause": "too_few_roworder_scans"
 | |
|                     } /* analyzing_roworder_intersect */
 | |
|                   } /* analyzing_range_alternatives */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t1`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "rows_to_scan": 2,
 | |
|                       "filtering_effect": [
 | |
|                       ] /* filtering_effect */,
 | |
|                       "final_filtering_effect": 1,
 | |
|                       "access_type": "scan",
 | |
|                       "resulting_rows": 2,
 | |
|                       "cost": 0.7016,
 | |
|                       "chosen": true,
 | |
|                       "use_tmp_table": true
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 2,
 | |
|                 "cost_for_plan": 0.7016,
 | |
|                 "sort_cost": 2,
 | |
|                 "new_cost_for_plan": 2.7016,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "(`t1`.`i1` >= 1)",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t1`",
 | |
|                   "attached": "(`t1`.`i1` >= 1)"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "optimizing_distinct_group_by_order_by": {
 | |
|               "simplifying_order_by": {
 | |
|                 "original_clause": "`t1`.`i1` desc",
 | |
|                 "items": [
 | |
|                   {
 | |
|                     "item": "`t1`.`i1`"
 | |
|                   }
 | |
|                 ] /* items */,
 | |
|                 "resulting_clause_is_simple": true,
 | |
|                 "resulting_clause": "`t1`.`i1` desc"
 | |
|               } /* simplifying_order_by */,
 | |
|               "unknown_key_1": {
 | |
|                 "reconsidering_access_paths_for_index_ordering": {
 | |
|                   "clause": "ORDER BY",
 | |
|                   "steps": [
 | |
|                   ] /* steps */,
 | |
|                   "index_order_summary": {
 | |
|                     "table": "`t1`",
 | |
|                     "index_provides_order": true,
 | |
|                     "order_direction": "desc",
 | |
|                     "index": "k1",
 | |
|                     "plan_changed": false
 | |
|                   } /* index_order_summary */
 | |
|                 } /* reconsidering_access_paths_for_index_ordering */
 | |
|               },
 | |
|               "unknown_key_2": {
 | |
|                 "reconsidering_access_paths_for_index_ordering": {
 | |
|                   "clause": "GROUP BY",
 | |
|                   "steps": [
 | |
|                   ] /* steps */,
 | |
|                   "index_order_summary": {
 | |
|                     "table": "`t1`",
 | |
|                     "index_provides_order": true,
 | |
|                     "order_direction": "desc",
 | |
|                     "index": "k1",
 | |
|                     "plan_changed": false
 | |
|                   } /* index_order_summary */
 | |
|                 } /* reconsidering_access_paths_for_index_ordering */
 | |
|               },
 | |
|               "changed_distinct_to_group_by": true,
 | |
|               "simplifying_group_by": {
 | |
|                 "original_clause": "`t1`.`i1` desc",
 | |
|                 "items": [
 | |
|                   {
 | |
|                     "item": "`t1`.`i1`"
 | |
|                   }
 | |
|                 ] /* items */,
 | |
|                 "resulting_clause_is_simple": true,
 | |
|                 "resulting_clause": "`t1`.`i1` desc"
 | |
|               } /* simplifying_group_by */,
 | |
|               "removed_order_by": true
 | |
|             } /* optimizing_distinct_group_by_order_by */
 | |
|           },
 | |
|           {
 | |
|             "reconsidering_access_paths_for_index_ordering": {
 | |
|               "clause": "GROUP BY",
 | |
|               "steps": [
 | |
|               ] /* steps */,
 | |
|               "index_order_summary": {
 | |
|                 "table": "`t1`",
 | |
|                 "index_provides_order": true,
 | |
|                 "order_direction": "desc",
 | |
|                 "index": "k1",
 | |
|                 "plan_changed": false
 | |
|               } /* index_order_summary */
 | |
|             } /* reconsidering_access_paths_for_index_ordering */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "original_table_condition": "(`t1`.`i1` >= 1)",
 | |
|                 "final_table_condition   ": "(`t1`.`i1` >= 1)"
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t1`"
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           },
 | |
|           {
 | |
|             "considering_tmp_tables": [
 | |
|             ] /* considering_tmp_tables */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| 
 | |
| DROP TABLE t1;
 | |
| CREATE TABLE t1 (
 | |
| pk INT PRIMARY KEY,
 | |
| i1 INT,
 | |
| i2 INT,
 | |
| v varchar(1),
 | |
| INDEX i1_idx (i1),
 | |
| INDEX v_idx (v,i1)
 | |
| ) ENGINE=InnoDB, CHARSET utf8mb4;
 | |
| INSERT INTO t1 VALUES (1, 1, 9,'a'), (2, 2, 8,'b'), (3, 3, 7,'c'),
 | |
| (4, 4, 6,'d'), (5, 5, 5,'e');
 | |
| 
 | |
| # Covering ROR intersect not chosen: Index with more keyparts found.
 | |
| EXPLAIN SELECT v FROM t1 WHERE i1 = 1 AND v = 'a' AND pk < 3;
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t1	NULL	range	PRIMARY,i1_idx,v_idx	v_idx	16	NULL	1	100.00	Using where; Using index
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select `test`.`t1`.`v` AS `v` from `test`.`t1` where ((`test`.`t1`.`v` = 'a') and (`test`.`t1`.`i1` = 1) and (`test`.`t1`.`pk` < 3))
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT v FROM t1 WHERE i1 = 1 AND v = 'a' AND pk < 3	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select `t1`.`v` AS `v` from `t1` where ((`t1`.`i1` = 1) and (`t1`.`v` = 'a') and (`t1`.`pk` < 3))"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "((`t1`.`i1` = 1) and (`t1`.`v` = 'a') and (`t1`.`pk` < 3))",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "((`t1`.`pk` < 3) and multiple equal(1, `t1`.`i1`) and multiple equal('a', `t1`.`v`))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "((`t1`.`pk` < 3) and multiple equal(1, `t1`.`i1`) and multiple equal('a', `t1`.`v`))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "((`t1`.`pk` < 3) and multiple equal(1, `t1`.`i1`) and multiple equal('a', `t1`.`v`))"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "field": "i1",
 | |
|                 "equals": "1",
 | |
|                 "null_rejecting": false
 | |
|               },
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "field": "v",
 | |
|                 "equals": "'a'",
 | |
|                 "null_rejecting": false
 | |
|               },
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "field": "i1",
 | |
|                 "equals": "1",
 | |
|                 "null_rejecting": false
 | |
|               }
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 5,
 | |
|                     "cost": 2.85
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "PRIMARY",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "pk"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i1_idx",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "i1",
 | |
|                         "pk"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "v_idx",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "v",
 | |
|                         "i1",
 | |
|                         "pk"
 | |
|                       ] /* key_parts */
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "best_covering_index_scan": {
 | |
|                     "index": "v_idx",
 | |
|                     "cost": 0.7519,
 | |
|                     "chosen": true
 | |
|                   } /* best_covering_index_scan */,
 | |
|                   "setup_range_conditions": [
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "group_index_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "not_group_by_or_distinct"
 | |
|                   } /* group_index_range */,
 | |
|                   "skip_scan_range": {
 | |
|                     "potential_skip_scan_indexes": [
 | |
|                       {
 | |
|                         "index": "PRIMARY",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i1_idx",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "v_idx",
 | |
|                         "usable": false,
 | |
|                         "cause": "prefix_not_const_equality"
 | |
|                       }
 | |
|                     ] /* potential_skip_scan_indexes */
 | |
|                   } /* skip_scan_range */,
 | |
|                   "analyzing_range_alternatives": {
 | |
|                     "range_scan_alternatives": [
 | |
|                       {
 | |
|                         "index": "PRIMARY",
 | |
|                         "ranges": [
 | |
|                           "pk < 3"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": true,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 2,
 | |
|                         "cost": 0.71,
 | |
|                         "chosen": true
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i1_idx",
 | |
|                         "ranges": [
 | |
|                           "1 <= i1 <= 1 AND pk < 3"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": true,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 1,
 | |
|                         "cost": 0.61,
 | |
|                         "chosen": true
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "v_idx",
 | |
|                         "ranges": [
 | |
|                           "a <= v <= a AND 1 <= i1 <= 1 AND pk < 3"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": true,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": true,
 | |
|                         "rows": 1,
 | |
|                         "cost": 0.36,
 | |
|                         "chosen": true
 | |
|                       }
 | |
|                     ] /* range_scan_alternatives */,
 | |
|                     "analyzing_roworder_intersect": {
 | |
|                       "intersecting_indexes": [
 | |
|                         {
 | |
|                           "index": "v_idx",
 | |
|                           "index_scan_cost": 0.25,
 | |
|                           "cumulated_index_scan_cost": 0.25,
 | |
|                           "disk_sweep_cost": 0,
 | |
|                           "cumulated_total_cost": 0.25,
 | |
|                           "usable": true,
 | |
|                           "matching_rows_now": 1,
 | |
|                           "isect_covering_with_this_index": true,
 | |
|                           "chosen": true
 | |
|                         }
 | |
|                       ] /* intersecting_indexes */,
 | |
|                       "clustered_pk": {
 | |
|                         "clustered_pk_added_to_intersect": false,
 | |
|                         "cause": "roworder_is_covering"
 | |
|                       } /* clustered_pk */,
 | |
|                       "chosen": false,
 | |
|                       "cause": "too_few_indexes_to_merge"
 | |
|                     } /* analyzing_roworder_intersect */
 | |
|                   } /* analyzing_range_alternatives */,
 | |
|                   "chosen_range_access_summary": {
 | |
|                     "range_access_plan": {
 | |
|                       "type": "range_scan",
 | |
|                       "index": "v_idx",
 | |
|                       "rows": 1,
 | |
|                       "ranges": [
 | |
|                         "a <= v <= a AND 1 <= i1 <= 1 AND pk < 3"
 | |
|                       ] /* ranges */
 | |
|                     } /* range_access_plan */,
 | |
|                     "rows_for_plan": 1,
 | |
|                     "cost_for_plan": 0.36,
 | |
|                     "chosen": true
 | |
|                   } /* chosen_range_access_summary */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t1`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "access_type": "ref",
 | |
|                       "index": "i1_idx",
 | |
|                       "chosen": false,
 | |
|                       "cause": "range_uses_more_keyparts"
 | |
|                     },
 | |
|                     {
 | |
|                       "access_type": "ref",
 | |
|                       "index": "v_idx",
 | |
|                       "chosen": false,
 | |
|                       "cause": "range_uses_more_keyparts"
 | |
|                     },
 | |
|                     {
 | |
|                       "rows_to_scan": 1,
 | |
|                       "filtering_effect": [
 | |
|                       ] /* filtering_effect */,
 | |
|                       "final_filtering_effect": 1,
 | |
|                       "access_type": "range",
 | |
|                       "range_details": {
 | |
|                         "used_index": "v_idx"
 | |
|                       } /* range_details */,
 | |
|                       "resulting_rows": 1,
 | |
|                       "cost": 0.46,
 | |
|                       "chosen": true
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 1,
 | |
|                 "cost_for_plan": 0.46,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "((`t1`.`v` = 'a') and (`t1`.`i1` = 1) and (`t1`.`pk` < 3))",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t1`",
 | |
|                   "attached": "((`t1`.`v` = 'a') and (`t1`.`i1` = 1) and (`t1`.`pk` < 3))"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "original_table_condition": "((`t1`.`v` = 'a') and (`t1`.`i1` = 1) and (`t1`.`pk` < 3))",
 | |
|                 "final_table_condition   ": "((`t1`.`v` = 'a') and (`t1`.`i1` = 1) and (`t1`.`pk` < 3))"
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t1`"
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| 
 | |
| # Chooses ROR intersect
 | |
| EXPLAIN SELECT v FROM t1 WHERE i1 = 1 AND pk < 3;
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t1	NULL	index_merge	PRIMARY,i1_idx,v_idx	i1_idx,PRIMARY	9,4	NULL	1	100.00	Using intersect(i1_idx,PRIMARY); Using where
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select `test`.`t1`.`v` AS `v` from `test`.`t1` where ((`test`.`t1`.`i1` = 1) and (`test`.`t1`.`pk` < 3))
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT v FROM t1 WHERE i1 = 1 AND pk < 3	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select `t1`.`v` AS `v` from `t1` where ((`t1`.`i1` = 1) and (`t1`.`pk` < 3))"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "((`t1`.`i1` = 1) and (`t1`.`pk` < 3))",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "((`t1`.`pk` < 3) and multiple equal(1, `t1`.`i1`))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "((`t1`.`pk` < 3) and multiple equal(1, `t1`.`i1`))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "((`t1`.`pk` < 3) and multiple equal(1, `t1`.`i1`))"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "field": "i1",
 | |
|                 "equals": "1",
 | |
|                 "null_rejecting": false
 | |
|               }
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 5,
 | |
|                     "cost": 2.85
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "PRIMARY",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "pk"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "i1_idx",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "i1",
 | |
|                         "pk"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "v_idx",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "v",
 | |
|                         "i1",
 | |
|                         "pk"
 | |
|                       ] /* key_parts */
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "best_covering_index_scan": {
 | |
|                     "index": "v_idx",
 | |
|                     "cost": 0.7519,
 | |
|                     "chosen": true
 | |
|                   } /* best_covering_index_scan */,
 | |
|                   "setup_range_conditions": [
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "group_index_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "not_group_by_or_distinct"
 | |
|                   } /* group_index_range */,
 | |
|                   "skip_scan_range": {
 | |
|                     "potential_skip_scan_indexes": [
 | |
|                       {
 | |
|                         "index": "PRIMARY",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i1_idx",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "v_idx",
 | |
|                         "tree_travel_cost": 0.15,
 | |
|                         "num_groups": 6,
 | |
|                         "rows": 5,
 | |
|                         "cost": 2.8019
 | |
|                       }
 | |
|                     ] /* potential_skip_scan_indexes */
 | |
|                   } /* skip_scan_range */,
 | |
|                   "best_skip_scan_summary": {
 | |
|                     "type": "skip_scan",
 | |
|                     "index": "v_idx",
 | |
|                     "key_parts_used_for_access": [
 | |
|                       "v",
 | |
|                       "i1"
 | |
|                     ] /* key_parts_used_for_access */,
 | |
|                     "range": [
 | |
|                       "1 <= i1 <= 1"
 | |
|                     ] /* range */,
 | |
|                     "chosen": false,
 | |
|                     "cause": "cost"
 | |
|                   } /* best_skip_scan_summary */,
 | |
|                   "analyzing_range_alternatives": {
 | |
|                     "range_scan_alternatives": [
 | |
|                       {
 | |
|                         "index": "PRIMARY",
 | |
|                         "ranges": [
 | |
|                           "pk < 3"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": true,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 2,
 | |
|                         "cost": 0.71,
 | |
|                         "chosen": true
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "i1_idx",
 | |
|                         "ranges": [
 | |
|                           "1 <= i1 <= 1 AND pk < 3"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": true,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 1,
 | |
|                         "cost": 0.61,
 | |
|                         "chosen": true
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "v_idx",
 | |
|                         "chosen": false,
 | |
|                         "cause": "no_valid_range_for_this_index"
 | |
|                       }
 | |
|                     ] /* range_scan_alternatives */,
 | |
|                     "analyzing_roworder_intersect": {
 | |
|                       "intersecting_indexes": [
 | |
|                         {
 | |
|                           "index": "i1_idx",
 | |
|                           "index_scan_cost": 0.25,
 | |
|                           "cumulated_index_scan_cost": 0.25,
 | |
|                           "disk_sweep_cost": 0.25,
 | |
|                           "cumulated_total_cost": 0.5,
 | |
|                           "usable": true,
 | |
|                           "matching_rows_now": 1,
 | |
|                           "isect_covering_with_this_index": false,
 | |
|                           "chosen": true
 | |
|                         }
 | |
|                       ] /* intersecting_indexes */,
 | |
|                       "clustered_pk": {
 | |
|                         "index_scan_cost": 0.05,
 | |
|                         "cumulated_index_scan_cost": 0.3,
 | |
|                         "disk_sweep_cost": 0,
 | |
|                         "clustered_pk_scan_added_to_intersect": true,
 | |
|                         "cumulated_cost": 0.3
 | |
|                       } /* clustered_pk */,
 | |
|                       "rows": 1,
 | |
|                       "cost": 0.3,
 | |
|                       "covering": false,
 | |
|                       "chosen": true
 | |
|                     } /* analyzing_roworder_intersect */
 | |
|                   } /* analyzing_range_alternatives */,
 | |
|                   "chosen_range_access_summary": {
 | |
|                     "range_access_plan": {
 | |
|                       "type": "index_roworder_intersect",
 | |
|                       "rows": 1,
 | |
|                       "cost": 0.3,
 | |
|                       "covering": false,
 | |
|                       "clustered_pk_scan": true,
 | |
|                       "intersect_of": [
 | |
|                         {
 | |
|                           "type": "range_scan",
 | |
|                           "index": "i1_idx",
 | |
|                           "rows": 1,
 | |
|                           "ranges": [
 | |
|                             "1 <= i1 <= 1 AND pk < 3"
 | |
|                           ] /* ranges */
 | |
|                         }
 | |
|                       ] /* intersect_of */
 | |
|                     } /* range_access_plan */,
 | |
|                     "rows_for_plan": 1,
 | |
|                     "cost_for_plan": 0.3,
 | |
|                     "chosen": true
 | |
|                   } /* chosen_range_access_summary */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t1`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "access_type": "ref",
 | |
|                       "index": "i1_idx",
 | |
|                       "chosen": false,
 | |
|                       "cause": "range_uses_more_keyparts"
 | |
|                     },
 | |
|                     {
 | |
|                       "rows_to_scan": 1,
 | |
|                       "filtering_effect": [
 | |
|                       ] /* filtering_effect */,
 | |
|                       "final_filtering_effect": 1,
 | |
|                       "access_type": "range",
 | |
|                       "range_details": {
 | |
|                         "used_index": "intersect(i1_idx,PRIMARY)"
 | |
|                       } /* range_details */,
 | |
|                       "resulting_rows": 1,
 | |
|                       "cost": 0.4,
 | |
|                       "chosen": true
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 1,
 | |
|                 "cost_for_plan": 0.4,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "((`t1`.`i1` = 1) and (`t1`.`pk` < 3))",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t1`",
 | |
|                   "attached": "((`t1`.`i1` = 1) and (`t1`.`pk` < 3))"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "original_table_condition": "((`t1`.`i1` = 1) and (`t1`.`pk` < 3))",
 | |
|                 "final_table_condition   ": "((`t1`.`i1` = 1) and (`t1`.`pk` < 3))"
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t1`"
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| 
 | |
| DROP TABLE t1;
 | |
| CREATE TABLE t1 (a int, b int, PRIMARY KEY (a,b), KEY b (b)) ENGINE=InnoDB STATS_PERSISTENT=0;
 | |
| INSERT INTO t1 VALUES (1,1),(1,2),(1,0),(1,3);
 | |
| 
 | |
| # Test trace for unreliable_ref_cost_and_range_uses_more_keyparts to
 | |
| # ignore ref access on index with overly optimistic cost-estimate
 | |
| EXPLAIN SELECT MAX(b), a FROM t1 WHERE b < 2 AND a = 1 GROUP BY a;
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t1	NULL	range	PRIMARY,b	b	4	NULL	2	25.00	Using where; Using index
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select max(`test`.`t1`.`b`) AS `MAX(b)`,`test`.`t1`.`a` AS `a` from `test`.`t1` where ((`test`.`t1`.`a` = 1) and (`test`.`t1`.`b` < 2)) group by `test`.`t1`.`a`
 | |
| 
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT MAX(b), a FROM t1 WHERE b < 2 AND a = 1 GROUP BY a	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select max(`t1`.`b`) AS `MAX(b)`,`t1`.`a` AS `a` from `t1` where ((`t1`.`b` < 2) and (`t1`.`a` = 1)) group by `t1`.`a`"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "((`t1`.`b` < 2) and (`t1`.`a` = 1))",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "((`t1`.`b` < 2) and multiple equal(1, `t1`.`a`))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "((`t1`.`b` < 2) and multiple equal(1, `t1`.`a`))"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "((`t1`.`b` < 2) and multiple equal(1, `t1`.`a`))"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "field": "a",
 | |
|                 "equals": "1",
 | |
|                 "null_rejecting": false
 | |
|               }
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 4,
 | |
|                     "cost": 2.75
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "PRIMARY",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "a",
 | |
|                         "b"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "b",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "b",
 | |
|                         "a"
 | |
|                       ] /* key_parts */
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "best_covering_index_scan": {
 | |
|                     "index": "b",
 | |
|                     "cost": 0.6511,
 | |
|                     "chosen": true
 | |
|                   } /* best_covering_index_scan */,
 | |
|                   "setup_range_conditions": [
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "group_index_range": {
 | |
|                     "potential_group_range_indexes": [
 | |
|                       {
 | |
|                         "index": "PRIMARY",
 | |
|                         "covering": true,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "ranges": [
 | |
|                           "1 <= a <= 1 AND b < 2"
 | |
|                         ] /* ranges */,
 | |
|                         "rows": 2,
 | |
|                         "cost": 0.55
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "b",
 | |
|                         "covering": true,
 | |
|                         "usable": false,
 | |
|                         "cause": "group_attribute_not_prefix_in_index"
 | |
|                       }
 | |
|                     ] /* potential_group_range_indexes */
 | |
|                   } /* group_index_range */,
 | |
|                   "best_group_range_summary": {
 | |
|                     "type": "index_group",
 | |
|                     "index": "PRIMARY",
 | |
|                     "group_attribute": "b",
 | |
|                     "min_aggregate": false,
 | |
|                     "max_aggregate": true,
 | |
|                     "distinct_aggregate": false,
 | |
|                     "rows": 2,
 | |
|                     "cost": 0.55,
 | |
|                     "key_parts_used_for_access": [
 | |
|                       "a"
 | |
|                     ] /* key_parts_used_for_access */,
 | |
|                     "ranges": [
 | |
|                       "1 <= a <= 1 AND b < 2"
 | |
|                     ] /* ranges */,
 | |
|                     "chosen": true
 | |
|                   } /* best_group_range_summary */,
 | |
|                   "skip_scan_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "has_group_by"
 | |
|                   } /* skip_scan_range */,
 | |
|                   "analyzing_range_alternatives": {
 | |
|                     "range_scan_alternatives": [
 | |
|                       {
 | |
|                         "index": "PRIMARY",
 | |
|                         "ranges": [
 | |
|                           "1 <= a <= 1 AND b < 2"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": true,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": true,
 | |
|                         "rows": 2,
 | |
|                         "cost": 0.71,
 | |
|                         "chosen": false,
 | |
|                         "cause": "cost"
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "b",
 | |
|                         "ranges": [
 | |
|                           "b < 2"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": false,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": true,
 | |
|                         "rows": 2,
 | |
|                         "cost": 0.4604,
 | |
|                         "chosen": true
 | |
|                       }
 | |
|                     ] /* range_scan_alternatives */,
 | |
|                     "analyzing_roworder_intersect": {
 | |
|                       "usable": false,
 | |
|                       "cause": "too_few_roworder_scans"
 | |
|                     } /* analyzing_roworder_intersect */
 | |
|                   } /* analyzing_range_alternatives */,
 | |
|                   "chosen_range_access_summary": {
 | |
|                     "range_access_plan": {
 | |
|                       "type": "range_scan",
 | |
|                       "index": "b",
 | |
|                       "rows": 2,
 | |
|                       "ranges": [
 | |
|                         "b < 2"
 | |
|                       ] /* ranges */
 | |
|                     } /* range_access_plan */,
 | |
|                     "rows_for_plan": 2,
 | |
|                     "cost_for_plan": 0.4604,
 | |
|                     "chosen": true
 | |
|                   } /* chosen_range_access_summary */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t1`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "access_type": "ref",
 | |
|                       "index": "PRIMARY",
 | |
|                       "chosen": false,
 | |
|                       "cause": "range_uses_more_keyparts"
 | |
|                     },
 | |
|                     {
 | |
|                       "rows_to_scan": 2,
 | |
|                       "filtering_effect": [
 | |
|                       ] /* filtering_effect */,
 | |
|                       "final_filtering_effect": 0.25,
 | |
|                       "access_type": "range",
 | |
|                       "range_details": {
 | |
|                         "used_index": "b"
 | |
|                       } /* range_details */,
 | |
|                       "resulting_rows": 0.5,
 | |
|                       "cost": 0.6604,
 | |
|                       "chosen": true,
 | |
|                       "use_tmp_table": true
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 0.5,
 | |
|                 "cost_for_plan": 0.6604,
 | |
|                 "sort_cost": 0.5,
 | |
|                 "new_cost_for_plan": 1.1604,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "((`t1`.`a` = 1) and (`t1`.`b` < 2))",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t1`",
 | |
|                   "attached": "((`t1`.`a` = 1) and (`t1`.`b` < 2))"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "optimizing_distinct_group_by_order_by": {
 | |
|               "simplifying_group_by": {
 | |
|                 "original_clause": "`t1`.`a`",
 | |
|                 "items": [
 | |
|                   {
 | |
|                     "item": "`t1`.`a`",
 | |
|                     "equals_constant_in_where": true
 | |
|                   }
 | |
|                 ] /* items */,
 | |
|                 "resulting_clause_is_simple": true,
 | |
|                 "resulting_clause": ""
 | |
|               } /* simplifying_group_by */
 | |
|             } /* optimizing_distinct_group_by_order_by */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "original_table_condition": "((`t1`.`a` = 1) and (`t1`.`b` < 2))",
 | |
|                 "final_table_condition   ": "((`t1`.`a` = 1) and (`t1`.`b` < 2))"
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t1`"
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| 
 | |
| drop table t1;
 | |
| #
 | |
| # Tracing of when test_if_skip_sort_order() switches to another
 | |
| # index and we abandon ICP,
 | |
| # see "disabling_pushed_condition_on_old_index" in trace.
 | |
| #
 | |
| CREATE TABLE t1 (
 | |
| c1 VARCHAR(2) NOT NULL,
 | |
| i1 INTEGER NOT NULL,
 | |
| c2 VARCHAR(2) NOT NULL,
 | |
| KEY k1 (c1),
 | |
| KEY k2 (c1, i1)
 | |
| ) CHARSET utf8mb4;
 | |
| INSERT INTO t1 VALUES ('0',3,'0'),('0',2,'1');
 | |
| EXPLAIN SELECT * FROM t1 WHERE c1 = '1' ORDER BY i1;
 | |
| id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t1	NULL	ref	k1,k2	k2	10	const	1	100.00	NULL
 | |
| Warnings:
 | |
| Note	1003	/* select#1 */ select `test`.`t1`.`c1` AS `c1`,`test`.`t1`.`i1` AS `i1`,`test`.`t1`.`c2` AS `c2` from `test`.`t1` where (`test`.`t1`.`c1` = '1') order by `test`.`t1`.`i1`
 | |
| SELECT * FROM information_schema.OPTIMIZER_TRACE;
 | |
| QUERY	TRACE	MISSING_BYTES_BEYOND_MAX_MEM_SIZE	INSUFFICIENT_PRIVILEGES
 | |
| EXPLAIN SELECT * FROM t1 WHERE c1 = '1' ORDER BY i1	{
 | |
|   "steps": [
 | |
|     {
 | |
|       "join_preparation": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "expanded_query": "/* select#1 */ select `t1`.`c1` AS `c1`,`t1`.`i1` AS `i1`,`t1`.`c2` AS `c2` from `t1` where (`t1`.`c1` = '1') order by `t1`.`i1`"
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_preparation */
 | |
|     },
 | |
|     {
 | |
|       "join_optimization": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|           {
 | |
|             "condition_processing": {
 | |
|               "condition": "WHERE",
 | |
|               "original_condition": "(`t1`.`c1` = '1')",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "transformation": "equality_propagation",
 | |
|                   "resulting_condition": "multiple equal('1', `t1`.`c1`)"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "constant_propagation",
 | |
|                   "resulting_condition": "multiple equal('1', `t1`.`c1`)"
 | |
|                 },
 | |
|                 {
 | |
|                   "transformation": "trivial_condition_removal",
 | |
|                   "resulting_condition": "multiple equal('1', `t1`.`c1`)"
 | |
|                 }
 | |
|               ] /* steps */
 | |
|             } /* condition_processing */
 | |
|           },
 | |
|           {
 | |
|             "substitute_generated_columns": {
 | |
|             } /* substitute_generated_columns */
 | |
|           },
 | |
|           {
 | |
|             "table_dependencies": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "row_may_be_null": false,
 | |
|                 "map_bit": 0,
 | |
|                 "depends_on_map_bits": [
 | |
|                 ] /* depends_on_map_bits */
 | |
|               }
 | |
|             ] /* table_dependencies */
 | |
|           },
 | |
|           {
 | |
|             "ref_optimizer_key_uses": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "field": "c1",
 | |
|                 "equals": "'1'",
 | |
|                 "null_rejecting": false
 | |
|               },
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "field": "c1",
 | |
|                 "equals": "'1'",
 | |
|                 "null_rejecting": false
 | |
|               }
 | |
|             ] /* ref_optimizer_key_uses */
 | |
|           },
 | |
|           {
 | |
|             "rows_estimation": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "range_analysis": {
 | |
|                   "table_scan": {
 | |
|                     "rows": 2,
 | |
|                     "cost": 2.8024
 | |
|                   } /* table_scan */,
 | |
|                   "potential_range_indexes": [
 | |
|                     {
 | |
|                       "index": "k1",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "c1"
 | |
|                       ] /* key_parts */
 | |
|                     },
 | |
|                     {
 | |
|                       "index": "k2",
 | |
|                       "usable": true,
 | |
|                       "key_parts": [
 | |
|                         "c1",
 | |
|                         "i1"
 | |
|                       ] /* key_parts */
 | |
|                     }
 | |
|                   ] /* potential_range_indexes */,
 | |
|                   "setup_range_conditions": [
 | |
|                   ] /* setup_range_conditions */,
 | |
|                   "group_index_range": {
 | |
|                     "chosen": false,
 | |
|                     "cause": "not_group_by_or_distinct"
 | |
|                   } /* group_index_range */,
 | |
|                   "skip_scan_range": {
 | |
|                     "potential_skip_scan_indexes": [
 | |
|                       {
 | |
|                         "index": "k1",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "k2",
 | |
|                         "usable": false,
 | |
|                         "cause": "query_references_nonkey_column"
 | |
|                       }
 | |
|                     ] /* potential_skip_scan_indexes */
 | |
|                   } /* skip_scan_range */,
 | |
|                   "analyzing_range_alternatives": {
 | |
|                     "range_scan_alternatives": [
 | |
|                       {
 | |
|                         "index": "k1",
 | |
|                         "ranges": [
 | |
|                           "1 <= c1 <= 1"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": true,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 1,
 | |
|                         "cost": 0.61,
 | |
|                         "chosen": true
 | |
|                       },
 | |
|                       {
 | |
|                         "index": "k2",
 | |
|                         "ranges": [
 | |
|                           "1 <= c1 <= 1"
 | |
|                         ] /* ranges */,
 | |
|                         "index_dives_for_eq_ranges": true,
 | |
|                         "rowid_ordered": false,
 | |
|                         "using_mrr": false,
 | |
|                         "index_only": false,
 | |
|                         "rows": 1,
 | |
|                         "cost": 0.61,
 | |
|                         "chosen": false,
 | |
|                         "cause": "cost"
 | |
|                       }
 | |
|                     ] /* range_scan_alternatives */,
 | |
|                     "analyzing_roworder_intersect": {
 | |
|                       "usable": false,
 | |
|                       "cause": "too_few_roworder_scans"
 | |
|                     } /* analyzing_roworder_intersect */
 | |
|                   } /* analyzing_range_alternatives */,
 | |
|                   "chosen_range_access_summary": {
 | |
|                     "range_access_plan": {
 | |
|                       "type": "range_scan",
 | |
|                       "index": "k1",
 | |
|                       "rows": 1,
 | |
|                       "ranges": [
 | |
|                         "1 <= c1 <= 1"
 | |
|                       ] /* ranges */
 | |
|                     } /* range_access_plan */,
 | |
|                     "rows_for_plan": 1,
 | |
|                     "cost_for_plan": 0.61,
 | |
|                     "chosen": true
 | |
|                   } /* chosen_range_access_summary */
 | |
|                 } /* range_analysis */
 | |
|               }
 | |
|             ] /* rows_estimation */
 | |
|           },
 | |
|           {
 | |
|             "considered_execution_plans": [
 | |
|               {
 | |
|                 "plan_prefix": [
 | |
|                 ] /* plan_prefix */,
 | |
|                 "table": "`t1`",
 | |
|                 "best_access_path": {
 | |
|                   "considered_access_paths": [
 | |
|                     {
 | |
|                       "access_type": "ref",
 | |
|                       "index": "k1",
 | |
|                       "rows": 1,
 | |
|                       "cost": 0.35,
 | |
|                       "chosen": true
 | |
|                     },
 | |
|                     {
 | |
|                       "access_type": "ref",
 | |
|                       "index": "k2",
 | |
|                       "rows": 1,
 | |
|                       "cost": 0.35,
 | |
|                       "chosen": false
 | |
|                     },
 | |
|                     {
 | |
|                       "access_type": "range",
 | |
|                       "range_details": {
 | |
|                         "used_index": "k1"
 | |
|                       } /* range_details */,
 | |
|                       "chosen": false,
 | |
|                       "cause": "heuristic_index_cheaper"
 | |
|                     }
 | |
|                   ] /* considered_access_paths */
 | |
|                 } /* best_access_path */,
 | |
|                 "condition_filtering_pct": 100,
 | |
|                 "rows_for_plan": 1,
 | |
|                 "cost_for_plan": 0.35,
 | |
|                 "chosen": true
 | |
|               }
 | |
|             ] /* considered_execution_plans */
 | |
|           },
 | |
|           {
 | |
|             "attaching_conditions_to_tables": {
 | |
|               "original_condition": "(`t1`.`c1` = '1')",
 | |
|               "attached_conditions_computation": [
 | |
|               ] /* attached_conditions_computation */,
 | |
|               "attached_conditions_summary": [
 | |
|                 {
 | |
|                   "table": "`t1`",
 | |
|                   "attached": "(`t1`.`c1` = '1')"
 | |
|                 }
 | |
|               ] /* attached_conditions_summary */
 | |
|             } /* attaching_conditions_to_tables */
 | |
|           },
 | |
|           {
 | |
|             "optimizing_distinct_group_by_order_by": {
 | |
|               "simplifying_order_by": {
 | |
|                 "original_clause": "`t1`.`i1`",
 | |
|                 "items": [
 | |
|                   {
 | |
|                     "item": "`t1`.`i1`"
 | |
|                   }
 | |
|                 ] /* items */,
 | |
|                 "resulting_clause_is_simple": true,
 | |
|                 "resulting_clause": "`t1`.`i1`"
 | |
|               } /* simplifying_order_by */
 | |
|             } /* optimizing_distinct_group_by_order_by */
 | |
|           },
 | |
|           {
 | |
|             "reconsidering_access_paths_for_index_ordering": {
 | |
|               "clause": "ORDER BY",
 | |
|               "steps": [
 | |
|                 {
 | |
|                   "check_if_range_uses_more_keyparts_than_ref": {
 | |
|                     "rerunning_range_optimizer_for_single_index": {
 | |
|                       "range_analysis": {
 | |
|                         "table_scan": {
 | |
|                           "rows": 2,
 | |
|                           "cost": 2e308
 | |
|                         } /* table_scan */,
 | |
|                         "potential_range_indexes": [
 | |
|                           {
 | |
|                             "index": "k1",
 | |
|                             "usable": false,
 | |
|                             "cause": "not_applicable"
 | |
|                           },
 | |
|                           {
 | |
|                             "index": "k2",
 | |
|                             "usable": true,
 | |
|                             "key_parts": [
 | |
|                               "c1",
 | |
|                               "i1"
 | |
|                             ] /* key_parts */
 | |
|                           }
 | |
|                         ] /* potential_range_indexes */,
 | |
|                         "setup_range_conditions": [
 | |
|                         ] /* setup_range_conditions */,
 | |
|                         "group_index_range": {
 | |
|                           "chosen": false,
 | |
|                           "cause": "not_group_by_or_distinct"
 | |
|                         } /* group_index_range */,
 | |
|                         "skip_scan_range": {
 | |
|                           "potential_skip_scan_indexes": [
 | |
|                             {
 | |
|                               "index": "k2",
 | |
|                               "usable": false,
 | |
|                               "cause": "query_references_nonkey_column"
 | |
|                             }
 | |
|                           ] /* potential_skip_scan_indexes */
 | |
|                         } /* skip_scan_range */,
 | |
|                         "analyzing_range_alternatives": {
 | |
|                           "range_scan_alternatives": [
 | |
|                             {
 | |
|                               "index": "k2",
 | |
|                               "ranges": [
 | |
|                                 "1 <= c1 <= 1"
 | |
|                               ] /* ranges */,
 | |
|                               "index_dives_for_eq_ranges": true,
 | |
|                               "rowid_ordered": false,
 | |
|                               "using_mrr": false,
 | |
|                               "index_only": false,
 | |
|                               "rows": 1,
 | |
|                               "cost": 0.61,
 | |
|                               "chosen": true
 | |
|                             }
 | |
|                           ] /* range_scan_alternatives */,
 | |
|                           "analyzing_roworder_intersect": {
 | |
|                             "usable": false,
 | |
|                             "cause": "too_few_roworder_scans"
 | |
|                           } /* analyzing_roworder_intersect */
 | |
|                         } /* analyzing_range_alternatives */,
 | |
|                         "chosen_range_access_summary": {
 | |
|                           "range_access_plan": {
 | |
|                             "type": "range_scan",
 | |
|                             "index": "k2",
 | |
|                             "rows": 1,
 | |
|                             "ranges": [
 | |
|                               "1 <= c1 <= 1"
 | |
|                             ] /* ranges */
 | |
|                           } /* range_access_plan */,
 | |
|                           "rows_for_plan": 1,
 | |
|                           "cost_for_plan": 0.61,
 | |
|                           "chosen": true
 | |
|                         } /* chosen_range_access_summary */
 | |
|                       } /* range_analysis */,
 | |
|                       "access_type_unchanged": {
 | |
|                         "ref_key_length": 10,
 | |
|                         "range_key_length": 10
 | |
|                       } /* access_type_unchanged */
 | |
|                     } /* rerunning_range_optimizer_for_single_index */
 | |
|                   } /* check_if_range_uses_more_keyparts_than_ref */
 | |
|                 }
 | |
|               ] /* steps */,
 | |
|               "index_order_summary": {
 | |
|                 "table": "`t1`",
 | |
|                 "index_provides_order": true,
 | |
|                 "order_direction": "asc",
 | |
|                 "index": "k2",
 | |
|                 "plan_changed": true,
 | |
|                 "access_type": "ref"
 | |
|               } /* index_order_summary */
 | |
|             } /* reconsidering_access_paths_for_index_ordering */
 | |
|           },
 | |
|           {
 | |
|             "finalizing_table_conditions": [
 | |
|               {
 | |
|                 "table": "`t1`",
 | |
|                 "original_table_condition": "(`t1`.`c1` = '1')",
 | |
|                 "final_table_condition   ": null
 | |
|               }
 | |
|             ] /* finalizing_table_conditions */
 | |
|           },
 | |
|           {
 | |
|             "refine_plan": [
 | |
|               {
 | |
|                 "table": "`t1`"
 | |
|               }
 | |
|             ] /* refine_plan */
 | |
|           },
 | |
|           {
 | |
|             "considering_tmp_tables": [
 | |
|             ] /* considering_tmp_tables */
 | |
|           }
 | |
|         ] /* steps */
 | |
|       } /* join_optimization */
 | |
|     },
 | |
|     {
 | |
|       "join_explain": {
 | |
|         "select#": 1,
 | |
|         "steps": [
 | |
|         ] /* steps */
 | |
|       } /* join_explain */
 | |
|     }
 | |
|   ] /* steps */
 | |
| }	0	0
 | |
| DROP TABLE t1;
 |