drop table if exists t0,t1,t2; create table t0(a int); insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); explain format=json select * from t0; EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "t0", "access_type": "ALL", "rows": 10, "filtered": 100 } } } explain format=json select * from t0 where 1>2; EXPLAIN { "query_block": { "select_id": 1, "table": { "message": "Impossible WHERE" } } } explain format=json select * from t0 where a<3; EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "t0", "access_type": "ALL", "rows": 10, "filtered": 100, "attached_condition": "(t0.a < 3)" } } } # Try a basic join create table t1 (a int, b int, filler char(32), key(a)); insert into t1 select a.a + b.a* 10 + c.a * 100, a.a + b.a* 10 + c.a * 100, 'filler' from t0 a, t0 b, t0 c; explain format=json select * from t0,t1 where t1.a=t0.a; EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "t0", "access_type": "ALL", "rows": 10, "filtered": 100, "attached_condition": "(t0.a is not null)" }, "table": { "table_name": "t1", "access_type": "ref", "possible_keys": ["a"], "key": "a", "key_length": "5", "used_key_parts": ["a"], "ref": ["test.t0.a"], "rows": 1, "filtered": 100 } } } # Try range and index_merge create table t2 (a1 int, a2 int, b1 int, b2 int, key(a1,a2), key(b1,b2)); insert into t2 select a,a,a,a from t1; explain format=json select * from t2 where a1<5; EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "t2", "access_type": "range", "possible_keys": ["a1"], "key": "a1", "key_length": "5", "used_key_parts": ["a1"], "rows": 5, "filtered": 100, "index_condition": "(t2.a1 < 5)" } } } explain format=json select * from t2 where a1=1 or b1=2; EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "t2", "access_type": "index_merge", "possible_keys": ["a1", "b1"], "key_length": "5,5", "index_merge": { "sort_union": { "range": { "key": "a1", "used_key_parts": ["a1"] }, "range": { "key": "b1", "used_key_parts": ["b1"] } } }, "rows": 2, "filtered": 100, "attached_condition": "((t2.a1 = 1) or (t2.b1 = 2))" } } } explain format=json select * from t2 where a1=1 or (b1=2 and b2=3); EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "t2", "access_type": "index_merge", "possible_keys": ["a1", "b1"], "key_length": "5,10", "index_merge": { "sort_union": { "range": { "key": "a1", "used_key_parts": ["a1"] }, "range": { "key": "b1", "used_key_parts": ["b1", "b2"] } } }, "rows": 2, "filtered": 100, "attached_condition": "((t2.a1 = 1) or ((t2.b1 = 2) and (t2.b2 = 3)))" } } } explain format=json select * from t2 where (a1=1 and a2=1) or (b1=2 and b2=1); EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "t2", "access_type": "index_merge", "possible_keys": ["a1", "b1"], "key_length": "10,10", "index_merge": { "union": { "range": { "key": "a1", "used_key_parts": ["a1", "a2"] }, "range": { "key": "b1", "used_key_parts": ["b1", "b2"] } } }, "rows": 2, "filtered": 100, "attached_condition": "(((t2.a1 = 1) and (t2.a2 = 1)) or ((t2.b1 = 2) and (t2.b2 = 1)))" } } } # Try ref access on two key components explain format=json select * from t0,t2 where t2.b1=t0.a and t2.b2=4; EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "t0", "access_type": "ALL", "rows": 10, "filtered": 100, "attached_condition": "(t0.a is not null)" }, "table": { "table_name": "t2", "access_type": "ref", "possible_keys": ["b1"], "key": "b1", "key_length": "10", "used_key_parts": ["b1", "b2"], "ref": ["test.t0.a", "const"], "rows": 1, "filtered": 100 } } } drop table t1,t2; # # Try a UNION # explain format=json select * from t0 A union select * from t0 B; EXPLAIN { "query_block": { "union_result": { "table_name": "", "access_type": "ALL", "query_specifications": [ { "query_block": { "select_id": 1, "table": { "table_name": "A", "access_type": "ALL", "rows": 10, "filtered": 100 } } }, { "query_block": { "select_id": 2, "table": { "table_name": "B", "access_type": "ALL", "rows": 10, "filtered": 100 } } } ] } } } explain format=json select * from t0 A union all select * from t0 B; EXPLAIN { "query_block": { "union_result": { "table_name": "", "access_type": "ALL", "query_specifications": [ { "query_block": { "select_id": 1, "table": { "table_name": "A", "access_type": "ALL", "rows": 10, "filtered": 100 } } }, { "query_block": { "select_id": 2, "table": { "table_name": "B", "access_type": "ALL", "rows": 10, "filtered": 100 } } } ] } } } # # Subqueries # create table t1 (a int, b int); insert into t1 select a,a from t0; explain format=json select a, a > (select max(b) from t1 where t1.b=t0.a) from t0; EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "t0", "access_type": "ALL", "rows": 10, "filtered": 100 }, "subqueries": [ { "query_block": { "select_id": 2, "table": { "table_name": "t1", "access_type": "ALL", "rows": 10, "filtered": 100, "attached_condition": "(t1.b = t0.a)" } } } ] } } explain format=json select * from t0 where a > (select max(b) from t1 where t1.b=t0.a) or a < 3 ; EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "t0", "access_type": "ALL", "rows": 10, "filtered": 100, "attached_condition": "((t0.a > (subquery#2)) or (t0.a < 3))" }, "subqueries": [ { "query_block": { "select_id": 2, "table": { "table_name": "t1", "access_type": "ALL", "rows": 10, "filtered": 100, "attached_condition": "(t1.b = t0.a)" } } } ] } } drop table t1; # # Join buffering # create table t1 (a int, b int); insert into t1 select tbl1.a+10*tbl2.a, tbl1.a+10*tbl2.a from t0 tbl1, t0 tbl2; explain format=json select * from t1 tbl1, t1 tbl2 where tbl1.a=tbl2.a and tbl1.b < 3 and tbl2.b < 5; EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "tbl1", "access_type": "ALL", "rows": 100, "filtered": 100, "attached_condition": "(tbl1.b < 3)" }, "block-nl-join": { "table": { "table_name": "tbl2", "access_type": "ALL", "rows": 100, "filtered": 100, "attached_condition": "(tbl2.b < 5)" }, "buffer_type": "flat", "join_type": "BNL", "attached_condition": "(tbl2.a = tbl1.a)" } } } drop table t1; # # Single-table UPDATE/DELETE, INSERT # explain format=json delete from t0; EXPLAIN { "query_block": { "select_id": 1, "table": { "message": "Deleting all rows" } } } explain format=json delete from t0 where 1 > 2; EXPLAIN { "query_block": { "select_id": 1, "table": { "message": "Impossible WHERE" } } } explain format=json delete from t0 where a < 3; EXPLAIN { "query_block": { "select_id": 1, "table": { "delete": 1, "table_name": "t0", "access_type": "ALL", "rows": 10, "attached_condition": "(t0.a < 3)" } } } explain format=json update t0 set a=3 where a in (2,3,4); EXPLAIN { "query_block": { "select_id": 1, "table": { "update": 1, "table_name": "t0", "access_type": "ALL", "rows": 10, "attached_condition": "(t0.a in (2,3,4))" } } } explain format=json insert into t0 values (1); EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "t0" } } } create table t1 like t0; explain format=json insert into t1 values ((select max(a) from t0)); EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "t1" }, "subqueries": [ { "query_block": { "select_id": 2, "table": { "table_name": "t0", "access_type": "ALL", "rows": 10, "filtered": 100 } } } ] } } drop table t1; # # A derived table # create table t1 (a int, b int); insert into t1 select a,a from t0; explain format=json select * from (select a, count(*) as cnt from t1 group by a) as tbl where cnt>0; EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "", "access_type": "ALL", "rows": 10, "filtered": 100, "attached_condition": "(tbl.cnt > 0)", "materialized": { "query_block": { "select_id": 2, "table": { "table_name": "t1", "access_type": "ALL", "rows": 10, "filtered": 100 } } } } } } explain format=json select * from (select a, count(*) as cnt from t1 group by a) as tbl1, t1 as tbl2 where cnt=tbl2.a; EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "tbl2", "access_type": "ALL", "rows": 10, "filtered": 100, "attached_condition": "(tbl2.a is not null)" }, "table": { "table_name": "", "access_type": "ref", "possible_keys": ["key0"], "key": "key0", "key_length": "8", "used_key_parts": ["cnt"], "ref": ["test.tbl2.a"], "rows": 2, "filtered": 100, "attached_condition": "(tbl1.cnt = tbl2.a)", "materialized": { "query_block": { "select_id": 2, "table": { "table_name": "t1", "access_type": "ALL", "rows": 10, "filtered": 100 } } } } } } # # Non-merged semi-join (aka JTBM) # explain format=json select * from t1 where a in (select max(a) from t1 group by b); EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "t1", "access_type": "ALL", "rows": 10, "filtered": 100, "attached_condition": "(t1.a is not null)" }, "table": { "table_name": "", "access_type": "eq_ref", "possible_keys": ["distinct_key"], "key": "distinct_key", "key_length": "4", "used_key_parts": ["max(a)"], "ref": ["test.t1.a"], "rows": 1, "filtered": 100, "materialized": { "unique": 1, "query_block": { "select_id": 2, "table": { "table_name": "t1", "access_type": "ALL", "rows": 10, "filtered": 100 } } } } } } # # Semi-join Materialization # create table t2 like t1; insert into t2 select * from t1; explain format=json select * from t1,t2 where t1.a in ( select a from t0); EXPLAIN { "query_block": { "select_id": 1, "const_condition": "1", "table": { "table_name": "t1", "access_type": "ALL", "rows": 10, "filtered": 100 }, "table": { "table_name": "", "access_type": "eq_ref", "possible_keys": ["distinct_key"], "key": "distinct_key", "key_length": "4", "used_key_parts": ["a"], "ref": ["func"], "rows": 1, "filtered": 100, "materialized": { "unique": 1, "query_block": { "select_id": 2, "table": { "table_name": "t0", "access_type": "ALL", "rows": 10, "filtered": 100 } } } }, "block-nl-join": { "table": { "table_name": "t2", "access_type": "ALL", "rows": 10, "filtered": 100 }, "buffer_type": "flat", "join_type": "BNL" } } } # # First-Match # explain select * from t2 where t2.a in ( select a from t1 where t1.b=t2.b); id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t2 ALL NULL NULL NULL NULL 10 1 PRIMARY t1 ALL NULL NULL NULL NULL 10 Using where; FirstMatch(t2); Using join buffer (flat, BNL join) explain format=json select * from t2 where t2.a in ( select a from t1 where t1.b=t2.b); EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "t2", "access_type": "ALL", "rows": 10, "filtered": 100 }, "block-nl-join": { "table": { "table_name": "t1", "access_type": "ALL", "rows": 10, "filtered": 100, "first_match": "t2" }, "buffer_type": "flat", "join_type": "BNL", "attached_condition": "((t1.b = t2.b) and (t1.a = t2.a))" } } } # # Duplicate Weedout # set @tmp= @@optimizer_switch; set optimizer_switch='firstmatch=off'; explain select * from t2 where t2.a in ( select a from t1 where t1.b=t2.b); id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t2 ALL NULL NULL NULL NULL 10 1 PRIMARY t1 ALL NULL NULL NULL NULL 10 Using where; Start temporary; End temporary; Using join buffer (flat, BNL join) explain format=json select * from t2 where t2.a in ( select a from t1 where t1.b=t2.b); EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "t2", "access_type": "ALL", "rows": 10, "filtered": 100 }, "duplicates_removal": { "block-nl-join": { "table": { "table_name": "t1", "access_type": "ALL", "rows": 10, "filtered": 100 }, "buffer_type": "flat", "join_type": "BNL", "attached_condition": "((t1.b = t2.b) and (t1.a = t2.a))" } } } } set optimizer_switch=@tmp; drop table t1,t2; # # MRR for range access (no BKA, just MRR) # create table t1 (a int, b int, key(a)); insert into t1 select tbl1.a+10*tbl2.a, 12345 from t0 tbl1, t0 tbl2; set @tmp= @@optimizer_switch; set optimizer_switch='mrr=on,mrr_sort_keys=on'; explain format=json select * from t1 where a < 3; EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "t1", "access_type": "range", "possible_keys": ["a"], "key": "a", "key_length": "5", "used_key_parts": ["a"], "rows": 1, "filtered": 100, "index_condition": "(t1.a < 3)", "mrr_type": "Rowid-ordered scan" } } } # 'Range checked for each record' set optimizer_switch=@tmp; explain format=json select * from t1 tbl1, t1 tbl2 where tbl2.a < tbl1.b; EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "tbl1", "access_type": "ALL", "rows": 100, "filtered": 100 }, "range-checked-for-each-record": { "keys": ["a"], "table": { "table_name": "tbl2", "access_type": "ALL", "possible_keys": ["a"], "rows": 100, "filtered": 100 } } } } drop table t1; drop table t0; # # MDEV-7265: "Full scan on NULL key", the join case # CREATE TABLE t1 (a INT, KEY(a)); INSERT INTO t1 VALUES (1),(2); CREATE TABLE t2 (b INT); INSERT INTO t2 VALUES (3),(4); EXPLAIN FORMAT=JSON SELECT * FROM t1 AS outer_t1 WHERE a <> ALL ( SELECT a FROM t1, t2 WHERE b <> outer_t1.a ); EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "outer_t1", "access_type": "index", "key": "a", "key_length": "5", "used_key_parts": ["a"], "rows": 2, "filtered": 100, "attached_condition": "(not((outer_t1.a,(subquery#2))))", "using_index": true }, "subqueries": [ { "query_block": { "select_id": 2, "full-scan-on-null_key": { "table": { "table_name": "t1", "access_type": "ref_or_null", "possible_keys": ["a"], "key": "a", "key_length": "5", "used_key_parts": ["a"], "ref": ["func"], "rows": 2, "filtered": 100, "attached_condition": "trigcond((((outer_t1.a) = t1.a) or isnull(t1.a)))", "using_index": true } }, "block-nl-join": { "table": { "table_name": "t2", "access_type": "ALL", "rows": 2, "filtered": 100 }, "buffer_type": "flat", "join_type": "BNL", "attached_condition": "((t2.b <> outer_t1.a) and trigcond((((outer_t1.a) = t1.a) or isnull(t1.a))))" } } } ] } } DROP TABLE t1,t2; # # Join's constant expression # create table t0(a int); insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); create table t1(a int, b int); insert into t1 select tbl1.a+10*tbl2.a, 1234 from t0 tbl1, t0 tbl2; explain format=json select * from t0 where 20000 > all (select max(tbl1.a + tbl2.a) from t1 tbl1, t1 tbl2 where tbl1.b=tbl2.b); EXPLAIN { "query_block": { "select_id": 1, "const_condition": "((20000,((subquery#2) >= 20000)))", "table": { "table_name": "t0", "access_type": "ALL", "rows": 10, "filtered": 100 }, "subqueries": [ { "query_block": { "select_id": 2, "table": { "table_name": "tbl1", "access_type": "ALL", "rows": 100, "filtered": 100 }, "block-nl-join": { "table": { "table_name": "tbl2", "access_type": "ALL", "rows": 100, "filtered": 100 }, "buffer_type": "flat", "join_type": "BNL", "attached_condition": "(tbl2.b = tbl1.b)" } } } ] } } drop table t1; drop table t0; # # MDEV-7264: Assertion `0' failed in subselect_engine::get_identifier() on EXPLAIN JSON # CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (1),(2); CREATE TABLE t2 (b INT); INSERT INTO t2 VALUES (3),(4); EXPLAIN FORMAT=JSON SELECT * FROM t1 WHERE a <> ALL ( SELECT b FROM t2 ); EXPLAIN { "query_block": { "select_id": 1, "table": { "table_name": "t1", "access_type": "ALL", "rows": 2, "filtered": 100, "attached_condition": "(not((t1.a,t1.a in (subquery#2))))" }, "subqueries": [ { "query_block": { "select_id": 2, "table": { "table_name": "t2", "access_type": "ALL", "rows": 2, "filtered": 100 } } } ] } } DROP TABLE t1, t2;