summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVarun Gupta <varun.gupta@mariadb.com>2021-03-05 15:30:21 +0530
committerVarun Gupta <varun.gupta@mariadb.com>2021-03-05 15:30:21 +0530
commit01cfc380d332c079168fda61e6c409e0917fafb0 (patch)
tree6394699b49d4822268f474f7054f8df3a8551b61
parent218c6a6bfb3b6886df9104d6febd144e3bf5b9e1 (diff)
downloadmariadb-git-10.6-mdev8306.tar.gz
Checking whether the join cardinality estimates are accurate should only be done when the order by limit optimization is enabled.
-rw-r--r--mysql-test/include/join_cardinality.inc61
-rw-r--r--mysql-test/main/join_cardinality.result433
-rw-r--r--mysql-test/main/join_cardinality.test102
-rw-r--r--sql/sql_select.cc2
4 files changed, 313 insertions, 285 deletions
diff --git a/mysql-test/include/join_cardinality.inc b/mysql-test/include/join_cardinality.inc
index 8d258a95324..1385a2f7899 100644
--- a/mysql-test/include/join_cardinality.inc
+++ b/mysql-test/include/join_cardinality.inc
@@ -2,42 +2,42 @@
--echo # BASIC CASES
--echo #
-EXPLAIN SELECT * FROM t1 WHERE t1.b <> 10;
+EXPLAIN SELECT * FROM t1 WHERE t1.b <> 10 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * FROM t1 WHERE t1.b > 10;
+EXPLAIN SELECT * FROM t1 WHERE t1.b > 10 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * FROM t1 WHERE t1.b < 10;
+EXPLAIN SELECT * FROM t1 WHERE t1.b < 10 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * FROM t1 WHERE t1.b = 10;
+EXPLAIN SELECT * FROM t1 WHERE t1.b = 10 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * FROM t1 WHERE t1.b+2 = 10;
+EXPLAIN SELECT * FROM t1 WHERE t1.b+2 = 10 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * FROM t1 WHERE a IN (1,2,3);
+EXPLAIN SELECT * FROM t1 WHERE a IN (1,2,3) ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 and 5;
+EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 and 5 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # Equi-join condition
-EXPLAIN SELECT * FROM t1,t2 WHERE t1.a=t2.b;
+EXPLAIN SELECT * FROM t1,t2 WHERE t1.a=t2.b ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # CASE where selectivity estimates are not accurate
-EXPLAIN SELECT * FROM t1 WHERE abs(t1.b) = 10;
+EXPLAIN SELECT * FROM t1 WHERE abs(t1.b) = 10 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -46,7 +46,7 @@ FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # selectivity for the predicate t1.c=10
--echo #
-EXPLAIN SELECT * FROM t1 WHERE t1.c = 10;
+EXPLAIN SELECT * FROM t1 WHERE t1.c = 10 ORDER BY t1.a LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -54,15 +54,16 @@ FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # BASIC CASES FOR AND CONJUNCT
--echo #
-EXPLAIN SELECT * FROM t1 WHERE a >= 5 and b <= 6;
+EXPLAIN SELECT * FROM t1 WHERE a >= 5 and b <= 6 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 AND 5 AND b <= 6;
+EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 AND 5 AND b <= 6
+ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * FROM t1,t2 WHERE t1.a > 5 AND t2.b < 10;
+EXPLAIN SELECT * FROM t1,t2 WHERE t1.a > 5 AND t2.b < 10 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -70,22 +71,24 @@ FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # BASIC CASES FOR OR CONJUNCT
--echo #
-EXPLAIN SELECT * FROM t1 WHERE a >= 5 OR a <= 2;
+EXPLAIN SELECT * FROM t1 WHERE a >= 5 OR a <= 2 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 AND 5 OR a <= 0;
+EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 AND 5 OR a <= 0
+ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # The cardinality here would be not accurate because for the
--echo # OR conjunct all predicates can't be resolved to one column
-EXPLAIN SELECT * FROM t1,t2 WHERE t1.a > 5 OR t2.b < 10;
+EXPLAIN SELECT * FROM t1,t2 WHERE t1.a > 5 OR t2.b < 10
+ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * FROM t1 WHERE a >= 5 OR b <= 6;
+EXPLAIN SELECT * FROM t1 WHERE a >= 5 OR b <= 6 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -93,15 +96,18 @@ FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # COMPLEX CASES WITH AND-OR CONJUNCTS
--echo #
-EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t1.a < 10);
+EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t1.a < 10)
+ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t2.b < 10);
+EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t2.b < 10)
+ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t2.a < 10);
+EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t2.a < 10)
+ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -109,11 +115,13 @@ EXPLAIN SELECT * FROM t1
WHERE ((t1.a > 20 and t1.a < 30) or (t1.a > 40 and t1.a < 50)) AND
((t1.a > 25 and t1.a < 35) or (t1.a > 45 and t1.a < 55)) OR
((t1.a > 120 and t1.a < 130) or (t1.a > 140 and t1.a < 150)) AND
-((t1.a > 125 and t1.a < 135) or (t1.a > 145 and t1.a < 155));
+((t1.a > 125 and t1.a < 135) or (t1.a > 145 and t1.a < 155))
+ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN EXTENDED SELECT * from t1 WHERE ((t1.a IS NULL) or (t1.a = 5));
+EXPLAIN EXTENDED SELECT * from t1 WHERE ((t1.a IS NULL) or (t1.a = 5))
+ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -121,16 +129,19 @@ FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # Test with subquery
--echo #
-EXPLAIN SELECT * from t1 WHERE t1.a = (select t2.a from t2 limit 1);
+EXPLAIN SELECT * from t1 WHERE t1.a = (select t2.a from t2 limit 1)
+ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
EXPLAIN SELECT * from t1
-WHERE t1.a = (select t2.a from t2 where t1.b=t2.b limit 1);
+WHERE t1.a = (select t2.a from t2 where t1.b=t2.b limit 1)
+ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
EXPLAIN SELECT * from t1
-WHERE t1.a = (select t2.a from t2 where t2.b > 10 limit 1) AND abs(t1.b)= 11;
+WHERE t1.a = (select t2.a from t2 where t2.b > 10 limit 1) AND abs(t1.b)= 11
+ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
diff --git a/mysql-test/main/join_cardinality.result b/mysql-test/main/join_cardinality.result
index 4249ec27e1b..3edd7f64c63 100644
--- a/mysql-test/main/join_cardinality.result
+++ b/mysql-test/main/join_cardinality.result
@@ -1,6 +1,7 @@
SET @save_optimizer_switch=@@optimizer_switch;
SET optimizer_trace=1;
SET optimizer_switch='rowid_filter=off';
+set optimizer_switch='cost_based_order_by_limit=on';
CREATE TABLE t1(a INT, b INT, c INT, KEY(b), KEY(a));
INSERT INTO t1 SELECT seq, seq, seq from seq_1_to_100;
CREATE TABLE t2(a INT, b INT, key(b));
@@ -12,63 +13,63 @@ INSERT INTO t2 SELECT seq, seq from seq_1_to_100;
#
# BASIC CASES
#
-EXPLAIN SELECT * FROM t1 WHERE t1.b <> 10;
+EXPLAIN SELECT * FROM t1 WHERE t1.b <> 10 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL b NULL NULL NULL 100 Using where
+1 SIMPLE t1 range b b 5 NULL 100 Using index condition; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * FROM t1 WHERE t1.b > 10;
+EXPLAIN SELECT * FROM t1 WHERE t1.b > 10 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL b NULL NULL NULL 100 Using where
+1 SIMPLE t1 range b b 5 NULL 95 Using index condition; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * FROM t1 WHERE t1.b < 10;
+EXPLAIN SELECT * FROM t1 WHERE t1.b < 10 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 range b b 5 NULL 5 Using index condition
+1 SIMPLE t1 range b b 5 NULL 5 Using index condition; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * FROM t1 WHERE t1.b = 10;
+EXPLAIN SELECT * FROM t1 WHERE t1.b = 10 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ref b b 5 const 1
+1 SIMPLE t1 ref b b 5 const 1 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * FROM t1 WHERE t1.b+2 = 10;
+EXPLAIN SELECT * FROM t1 WHERE t1.b+2 = 10 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
false
]
-EXPLAIN SELECT * FROM t1 WHERE a IN (1,2,3);
+EXPLAIN SELECT * FROM t1 WHERE a IN (1,2,3) ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 range a a 5 NULL 3 Using index condition
+1 SIMPLE t1 range a a 5 NULL 3 Using index condition; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 and 5;
+EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 and 5 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 range a a 5 NULL 3 Using index condition
+1 SIMPLE t1 range a a 5 NULL 3 Using index condition; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -76,10 +77,10 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
true
]
# Equi-join condition
-EXPLAIN SELECT * FROM t1,t2 WHERE t1.a=t2.b;
+EXPLAIN SELECT * FROM t1,t2 WHERE t1.a=t2.b ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t2 ALL b NULL NULL NULL 100 Using where
-1 SIMPLE t1 ref a a 5 test.t2.b 1
+1 SIMPLE t1 ALL a NULL NULL NULL 100 Using where; Using filesort
+1 SIMPLE t2 ref b b 5 test.t1.a 1
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -87,9 +88,9 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
true
]
# CASE where selectivity estimates are not accurate
-EXPLAIN SELECT * FROM t1 WHERE abs(t1.b) = 10;
+EXPLAIN SELECT * FROM t1 WHERE abs(t1.b) = 10 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -100,9 +101,9 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
# The cardinality here would be not accurate because we don't have
# selectivity for the predicate t1.c=10
#
-EXPLAIN SELECT * FROM t1 WHERE t1.c = 10;
+EXPLAIN SELECT * FROM t1 WHERE t1.c = 10 ORDER BY t1.a LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -112,28 +113,29 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
#
# BASIC CASES FOR AND CONJUNCT
#
-EXPLAIN SELECT * FROM t1 WHERE a >= 5 and b <= 6;
+EXPLAIN SELECT * FROM t1 WHERE a >= 5 and b <= 6 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 range b,a b 5 NULL 3 Using index condition; Using where
+1 SIMPLE t1 range b,a b 5 NULL 3 Using index condition; Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 AND 5 AND b <= 6;
+EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 AND 5 AND b <= 6
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 range b,a b 5 NULL 3 Using index condition; Using where
+1 SIMPLE t1 range b,a b 5 NULL 3 Using index condition; Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * FROM t1,t2 WHERE t1.a > 5 AND t2.b < 10;
+EXPLAIN SELECT * FROM t1,t2 WHERE t1.a > 5 AND t2.b < 10 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL a NULL NULL NULL 100 Using where; Using filesort
1 SIMPLE t2 range b b 5 NULL 5 Using index condition
-1 SIMPLE t1 ALL a NULL NULL NULL 100 Using where; Using join buffer (flat, BNL join)
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -143,18 +145,19 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
#
# BASIC CASES FOR OR CONJUNCT
#
-EXPLAIN SELECT * FROM t1 WHERE a >= 5 OR a <= 2;
+EXPLAIN SELECT * FROM t1 WHERE a >= 5 OR a <= 2 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL a NULL NULL NULL 100 Using where
+1 SIMPLE t1 range a a 5 NULL 99 Using index condition; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 AND 5 OR a <= 0;
+EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 AND 5 OR a <= 0
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 range a a 5 NULL 4 Using index condition
+1 SIMPLE t1 range a a 5 NULL 4 Using index condition; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -163,9 +166,10 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
]
# The cardinality here would be not accurate because for the
# OR conjunct all predicates can't be resolved to one column
-EXPLAIN SELECT * FROM t1,t2 WHERE t1.a > 5 OR t2.b < 10;
+EXPLAIN SELECT * FROM t1,t2 WHERE t1.a > 5 OR t2.b < 10
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL a NULL NULL NULL 100
+1 SIMPLE t1 ALL a NULL NULL NULL 100 Using temporary; Using filesort
1 SIMPLE t2 ALL b NULL NULL NULL 100 Using where; Using join buffer (flat, BNL join)
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -173,9 +177,9 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
false
]
-EXPLAIN SELECT * FROM t1 WHERE a >= 5 OR b <= 6;
+EXPLAIN SELECT * FROM t1 WHERE a >= 5 OR b <= 6 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL b,a NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL b,a NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -185,30 +189,33 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
#
# COMPLEX CASES WITH AND-OR CONJUNCTS
#
-EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t1.a < 10);
+EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t1.a < 10)
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t2 ALL b NULL NULL NULL 100 Using where
-1 SIMPLE t1 ref a a 5 test.t2.b 1
+1 SIMPLE t1 ALL a NULL NULL NULL 100 Using where; Using filesort
+1 SIMPLE t2 ref b b 5 test.t1.a 1
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t2.b < 10);
+EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t2.b < 10)
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t2 ALL b NULL NULL NULL 100 Using where
-1 SIMPLE t1 ref a a 5 test.t2.b 1
+1 SIMPLE t1 ALL a NULL NULL NULL 100 Using where; Using filesort
+1 SIMPLE t2 ref b b 5 test.t1.a 1
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t2.a < 10);
+EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t2.a < 10)
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t2 ALL b NULL NULL NULL 100 Using where
-1 SIMPLE t1 ref a a 5 test.t2.b 1
+1 SIMPLE t1 range a a 5 NULL 100 Using index condition; Using filesort
+1 SIMPLE t2 ref b b 5 test.t1.a 1 Using where
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -219,20 +226,22 @@ EXPLAIN SELECT * FROM t1
WHERE ((t1.a > 20 and t1.a < 30) or (t1.a > 40 and t1.a < 50)) AND
((t1.a > 25 and t1.a < 35) or (t1.a > 45 and t1.a < 55)) OR
((t1.a > 120 and t1.a < 130) or (t1.a > 140 and t1.a < 150)) AND
-((t1.a > 125 and t1.a < 135) or (t1.a > 145 and t1.a < 155));
+((t1.a > 125 and t1.a < 135) or (t1.a > 145 and t1.a < 155))
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 range a a 5 NULL 6 Using index condition
+1 SIMPLE t1 range a a 5 NULL 6 Using index condition; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN EXTENDED SELECT * from t1 WHERE ((t1.a IS NULL) or (t1.a = 5));
+EXPLAIN EXTENDED SELECT * from t1 WHERE ((t1.a IS NULL) or (t1.a = 5))
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ref_or_null a a 5 const 2 100.00 Using index condition
+1 SIMPLE t1 ref_or_null a a 5 const 2 100.00 Using index condition; Using filesort
Warnings:
-Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c` from `test`.`t1` where `test`.`t1`.`a` is null or `test`.`t1`.`a` = 5
+Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c` from `test`.`t1` where `test`.`t1`.`a` is null or `test`.`t1`.`a` = 5 order by `test`.`t1`.`c` limit 5
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -242,9 +251,10 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
#
# Test with subquery
#
-EXPLAIN SELECT * from t1 WHERE t1.a = (select t2.a from t2 limit 1);
+EXPLAIN SELECT * from t1 WHERE t1.a = (select t2.a from t2 limit 1)
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 PRIMARY t1 ref a a 5 const 1 Using where
+1 PRIMARY t1 ref a a 5 const 1 Using where; Using filesort
2 SUBQUERY t2 ALL NULL NULL NULL NULL 100
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -253,27 +263,27 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
true
]
EXPLAIN SELECT * from t1
-WHERE t1.a = (select t2.a from t2 where t1.b=t2.b limit 1);
+WHERE t1.a = (select t2.a from t2 where t1.b=t2.b limit 1)
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 PRIMARY t1 ALL NULL NULL NULL NULL 100 Using where
+1 PRIMARY t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
2 DEPENDENT SUBQUERY t2 ref b b 5 test.t1.b 1
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
- false,
false
]
EXPLAIN SELECT * from t1
-WHERE t1.a = (select t2.a from t2 where t2.b > 10 limit 1) AND abs(t1.b)= 11;
+WHERE t1.a = (select t2.a from t2 where t2.b > 10 limit 1) AND abs(t1.b)= 11
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 PRIMARY t1 ref a a 5 const 1 Using where
+1 PRIMARY t1 ref a a 5 const 1 Using where; Using filesort
2 SUBQUERY t2 range b b 5 NULL 95 Using index condition
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
- true,
false
]
DROP TABLE t1,t2;
@@ -288,63 +298,63 @@ INSERT INTO t2 SELECT seq, seq from seq_1_to_100;
#
# BASIC CASES
#
-EXPLAIN SELECT * FROM t1 WHERE t1.b <> 10;
+EXPLAIN SELECT * FROM t1 WHERE t1.b <> 10 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * FROM t1 WHERE t1.b > 10;
+EXPLAIN SELECT * FROM t1 WHERE t1.b > 10 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * FROM t1 WHERE t1.b < 10;
+EXPLAIN SELECT * FROM t1 WHERE t1.b < 10 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * FROM t1 WHERE t1.b = 10;
+EXPLAIN SELECT * FROM t1 WHERE t1.b = 10 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * FROM t1 WHERE t1.b+2 = 10;
+EXPLAIN SELECT * FROM t1 WHERE t1.b+2 = 10 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
false
]
-EXPLAIN SELECT * FROM t1 WHERE a IN (1,2,3);
+EXPLAIN SELECT * FROM t1 WHERE a IN (1,2,3) ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 and 5;
+EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 and 5 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -352,10 +362,10 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
true
]
# Equi-join condition
-EXPLAIN SELECT * FROM t1,t2 WHERE t1.a=t2.b;
+EXPLAIN SELECT * FROM t1,t2 WHERE t1.a=t2.b ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100
-1 SIMPLE t2 ALL NULL NULL NULL NULL 100 Using where; Using join buffer (flat, BNL join)
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using filesort
+1 SIMPLE t2 ALL NULL NULL NULL NULL 100 Using where
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -363,9 +373,9 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
true
]
# CASE where selectivity estimates are not accurate
-EXPLAIN SELECT * FROM t1 WHERE abs(t1.b) = 10;
+EXPLAIN SELECT * FROM t1 WHERE abs(t1.b) = 10 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -376,9 +386,9 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
# The cardinality here would be not accurate because we don't have
# selectivity for the predicate t1.c=10
#
-EXPLAIN SELECT * FROM t1 WHERE t1.c = 10;
+EXPLAIN SELECT * FROM t1 WHERE t1.c = 10 ORDER BY t1.a LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -388,28 +398,29 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
#
# BASIC CASES FOR AND CONJUNCT
#
-EXPLAIN SELECT * FROM t1 WHERE a >= 5 and b <= 6;
+EXPLAIN SELECT * FROM t1 WHERE a >= 5 and b <= 6 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 AND 5 AND b <= 6;
+EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 AND 5 AND b <= 6
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * FROM t1,t2 WHERE t1.a > 5 AND t2.b < 10;
+EXPLAIN SELECT * FROM t1,t2 WHERE t1.a > 5 AND t2.b < 10 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
1 SIMPLE t2 ALL NULL NULL NULL NULL 100 Using where
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using join buffer (flat, BNL join)
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -419,18 +430,19 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
#
# BASIC CASES FOR OR CONJUNCT
#
-EXPLAIN SELECT * FROM t1 WHERE a >= 5 OR a <= 2;
+EXPLAIN SELECT * FROM t1 WHERE a >= 5 OR a <= 2 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 AND 5 OR a <= 0;
+EXPLAIN SELECT * FROM t1 WHERE a BETWEEN 1 AND 5 OR a <= 0
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -439,9 +451,10 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
]
# The cardinality here would be not accurate because for the
# OR conjunct all predicates can't be resolved to one column
-EXPLAIN SELECT * FROM t1,t2 WHERE t1.a > 5 OR t2.b < 10;
+EXPLAIN SELECT * FROM t1,t2 WHERE t1.a > 5 OR t2.b < 10
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using temporary; Using filesort
1 SIMPLE t2 ALL NULL NULL NULL NULL 100 Using where; Using join buffer (flat, BNL join)
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -449,9 +462,9 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
false
]
-EXPLAIN SELECT * FROM t1 WHERE a >= 5 OR b <= 6;
+EXPLAIN SELECT * FROM t1 WHERE a >= 5 OR b <= 6 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -461,29 +474,32 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
#
# COMPLEX CASES WITH AND-OR CONJUNCTS
#
-EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t1.a < 10);
+EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t1.a < 10)
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
-1 SIMPLE t2 ALL NULL NULL NULL NULL 100 Using where; Using join buffer (flat, BNL join)
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
+1 SIMPLE t2 ALL NULL NULL NULL NULL 100 Using where
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t2.b < 10);
+EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t2.b < 10)
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
-1 SIMPLE t2 ALL NULL NULL NULL NULL 100 Using where; Using join buffer (flat, BNL join)
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
+1 SIMPLE t2 ALL NULL NULL NULL NULL 100 Using where
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t2.a < 10);
+EXPLAIN SELECT * from t1,t2 WHERE t1.a=t2.b and (t1.a > 5 or t2.a < 10)
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using temporary; Using filesort
1 SIMPLE t2 ALL NULL NULL NULL NULL 100 Using where; Using join buffer (flat, BNL join)
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -495,20 +511,22 @@ EXPLAIN SELECT * FROM t1
WHERE ((t1.a > 20 and t1.a < 30) or (t1.a > 40 and t1.a < 50)) AND
((t1.a > 25 and t1.a < 35) or (t1.a > 45 and t1.a < 55)) OR
((t1.a > 120 and t1.a < 130) or (t1.a > 140 and t1.a < 150)) AND
-((t1.a > 125 and t1.a < 135) or (t1.a > 145 and t1.a < 155));
+((t1.a > 125 and t1.a < 135) or (t1.a > 145 and t1.a < 155))
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN EXTENDED SELECT * from t1 WHERE ((t1.a IS NULL) or (t1.a = 5));
+EXPLAIN EXTENDED SELECT * from t1 WHERE ((t1.a IS NULL) or (t1.a = 5))
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 1.00 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 1.00 Using where; Using filesort
Warnings:
-Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c` from `test`.`t1` where `test`.`t1`.`a` is null or `test`.`t1`.`a` = 5
+Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c` from `test`.`t1` where `test`.`t1`.`a` is null or `test`.`t1`.`a` = 5 order by `test`.`t1`.`c` limit 5
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -518,9 +536,10 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
#
# Test with subquery
#
-EXPLAIN SELECT * from t1 WHERE t1.a = (select t2.a from t2 limit 1);
+EXPLAIN SELECT * from t1 WHERE t1.a = (select t2.a from t2 limit 1)
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 PRIMARY t1 ALL NULL NULL NULL NULL 100 Using where
+1 PRIMARY t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
2 SUBQUERY t2 ALL NULL NULL NULL NULL 100
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -529,27 +548,27 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
true
]
EXPLAIN SELECT * from t1
-WHERE t1.a = (select t2.a from t2 where t1.b=t2.b limit 1);
+WHERE t1.a = (select t2.a from t2 where t1.b=t2.b limit 1)
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 PRIMARY t1 ALL NULL NULL NULL NULL 100 Using where
+1 PRIMARY t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
2 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 100 Using where
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
- false,
false
]
EXPLAIN SELECT * from t1
-WHERE t1.a = (select t2.a from t2 where t2.b > 10 limit 1) AND abs(t1.b)= 11;
+WHERE t1.a = (select t2.a from t2 where t2.b > 10 limit 1) AND abs(t1.b)= 11
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 PRIMARY t1 ALL NULL NULL NULL NULL 100 Using where
+1 PRIMARY t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
2 SUBQUERY t2 ALL NULL NULL NULL NULL 100 Using where
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
- true,
false
]
DROP TABLE t1,t2;
@@ -557,11 +576,11 @@ DROP TABLE t1,t2;
# Combination with statistics from stat tables and
# statistics from indexes
#
-CREATE TABLE t1(a INT, b INT, KEY(a));
-INSERT INTO t1 SELECT seq, seq from seq_1_to_100;
-ANALYZE SELECT * from t1 WHERE t1.b > 3 AND t1.a=t1.b;
+CREATE TABLE t1(a INT, b INT, c INT, KEY(a));
+INSERT INTO t1 SELECT seq, seq, seq from seq_1_to_100;
+ANALYZE SELECT * from t1 WHERE t1.b > 3 AND t1.a=t1.b ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
-1 SIMPLE t1 ALL a NULL NULL NULL 100 100.00 98.00 97.00 Using where
+1 SIMPLE t1 range a a 5 NULL 98 5.00 100.00 100.00 Using index condition; Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -572,27 +591,27 @@ ANALYZE TABLE t1 PERSISTENT FOR COLUMNS (b) INDEXES ();
Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status Table is already up to date
-ANALYZE SELECT * from t1 WHERE t1.b > 3 AND t1.a=10;
+ANALYZE SELECT * from t1 WHERE t1.b > 3 AND t1.a=10 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
-1 SIMPLE t1 ref a a 5 const 1 1.00 97.66 100.00 Using where
+1 SIMPLE t1 ref a a 5 const 1 1.00 97.66 100.00 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-ANALYZE SELECT * from t1 WHERE t1.b > 3 AND t1.a=t1.b;
+ANALYZE SELECT * from t1 WHERE t1.b > 3 AND t1.a=t1.b ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
-1 SIMPLE t1 ALL a NULL NULL NULL 100 100.00 95.70 97.00 Using where
+1 SIMPLE t1 range a a 5 NULL 98 5.00 97.66 100.00 Using index condition; Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-ANALYZE SELECT * from t1 WHERE t1.b > 3 OR t1.a=t1.b;
+ANALYZE SELECT * from t1 WHERE t1.b > 3 OR t1.a=t1.b ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 100.00 100.00 100.00 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 5.00 100.00 100.00 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -608,18 +627,18 @@ INSERT INTO t1 SELECT seq, seq, seq from seq_1_to_10;
#
# Tests with LIKE PREDICATES
#
-EXPLAIN SELECT * from t1 WHERE t1.a LIKE '%2%';
+EXPLAIN SELECT * from t1 WHERE t1.a LIKE '%2%' ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
false
]
-EXPLAIN SELECT * from t1 WHERE t1.a LIKE '2%';
+EXPLAIN SELECT * from t1 WHERE t1.a LIKE '2%' ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL a NULL NULL NULL 10 Using where
+1 SIMPLE t1 ALL a NULL NULL NULL 10 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -629,18 +648,18 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
#
# Tests with NULL predicates
#
-EXPLAIN SELECT * from t1 WHERE t1.a IS NULL;
+EXPLAIN SELECT * from t1 WHERE t1.a IS NULL ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ref a a 5 const 1 Using index condition
+1 SIMPLE t1 ref a a 5 const 1 Using index condition; Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * from t1 WHERE t1.a IS NOT NULL;
+EXPLAIN SELECT * from t1 WHERE t1.a IS NOT NULL ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL a NULL NULL NULL 10 Using where
+1 SIMPLE t1 range a a 5 NULL 10 Using index condition; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -650,54 +669,54 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
#
# Tests with </<=/>/>=/BETWEEN
#
-EXPLAIN SELECT * from t1 WHERE t1.a > 5;
+EXPLAIN SELECT * from t1 WHERE t1.a > 5 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL a NULL NULL NULL 10 Using where
+1 SIMPLE t1 ALL a NULL NULL NULL 10 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * from t1 WHERE 5 < t1.a;
+EXPLAIN SELECT * from t1 WHERE 5 < t1.a ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL a NULL NULL NULL 10 Using where
+1 SIMPLE t1 ALL a NULL NULL NULL 10 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * from t1 WHERE t1.a >= 10 and t1.b <= 10;
+EXPLAIN SELECT * from t1 WHERE t1.a >= 10 and t1.b <= 10 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 range a,b a 5 NULL 1 Using index condition; Using where
+1 SIMPLE t1 range a,b a 5 NULL 1 Using index condition; Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * from t1 WHERE t1.a BETWEEN 1 AND 5;
+EXPLAIN SELECT * from t1 WHERE t1.a BETWEEN 1 AND 5 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL a NULL NULL NULL 10 Using where
+1 SIMPLE t1 ALL a NULL NULL NULL 10 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * from t1 WHERE 5 BETWEEN 1 AND t1.a;
+EXPLAIN SELECT * from t1 WHERE 5 BETWEEN 1 AND t1.a ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL a NULL NULL NULL 10 Using where
+1 SIMPLE t1 range a a 5 NULL 6 Using index condition; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * from t1 WHERE 1 BETWEEN t1.a AND t1.b;
+EXPLAIN SELECT * from t1 WHERE 1 BETWEEN t1.a AND t1.b ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 range a,b a 5 NULL 1 Using where
+1 SIMPLE t1 range a,b a 5 NULL 1 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -707,18 +726,19 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
#
# Tests with IN predicate
#
-EXPLAIN SELECT * from t1 WHERE t1.a IN (1,2,3);
+EXPLAIN SELECT * from t1 WHERE t1.a IN (1,2,3) ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 range a a 5 NULL 3 Using index condition
+1 SIMPLE t1 range a a 5 NULL 3 Using index condition; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN SELECT * from t1 WHERE (t1.a,t1.b) IN ((1,1), (2,2), (3,3));
+EXPLAIN SELECT * from t1 WHERE (t1.a,t1.b) IN ((1,1), (2,2), (3,3))
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 index_merge a,b a,a,a 5,5,5 NULL 3 Using union(a,a,a); Using where
+1 SIMPLE t1 index_merge a,b a,a,a 5,5,5 NULL 3 Using union(a,a,a); Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -726,9 +746,10 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
false
]
EXPLAIN SELECT * from t1 WHERE
-t1.a=t1.b AND (t1.a,t1.b) IN ((1,1), (2,2), (3,3));
+t1.a=t1.b AND (t1.a,t1.b) IN ((1,1), (2,2), (3,3))
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 index_merge a,b a,a,a 5,5,5 NULL 3 Using union(a,a,a); Using where
+1 SIMPLE t1 index_merge a,b a,a,a 5,5,5 NULL 3 Using union(a,a,a); Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -736,9 +757,10 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
false
]
EXPLAIN SELECT * from t1
-WHERE t1.a=t1.b AND (abs(t1.a),t1.b) IN ((1,1), (2,2), (3,3));
+WHERE t1.a=t1.b AND (abs(t1.a),t1.b) IN ((1,1), (2,2), (3,3))
+ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 range a,b b 5 NULL 3 Using where
+1 SIMPLE t1 range a,b b 5 NULL 3 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -748,27 +770,27 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
#
# Tests using different functional predicates
#
-EXPLAIN SELECT * from t1 WHERE a < 5 XOR a > 10;
+EXPLAIN SELECT * from t1 WHERE a < 5 XOR a > 10 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
false
]
-EXPLAIN SELECT * from t1 WHERE abs(a) > 10;
+EXPLAIN SELECT * from t1 WHERE abs(a) > 10 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
false
]
-EXPLAIN SELECT * from t1 WHERE a > 10+1;
+EXPLAIN SELECT * from t1 WHERE a > 10+1 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 range a a 5 NULL 1 Using index condition
+1 SIMPLE t1 range a a 5 NULL 1 Using index condition; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -786,9 +808,9 @@ mysql.column_stats(db_name, table_name, column_name, nulls_ratio) VALUES ('test'
#
# estimates from stat tables not available, all the fields should be NOT NULL
#
-EXPLAIN SELECT * from t1 WHERE a < 10;
+EXPLAIN SELECT * from t1 WHERE a < 10 ORDER BY t1.b LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 100 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -799,8 +821,8 @@ DROP TABLE t1;
#
# Using multiple equalities at the top level
#
-CREATE TABLE t1(a INT, b INT);
-INSERT INTO t1 SELECT seq, seq from seq_1_to_10;
+CREATE TABLE t1(a INT, b INT, c INT);
+INSERT INTO t1 SELECT seq, seq, seq from seq_1_to_10;
CREATE TABLE t2(a INT, b INT);
INSERT INTO t2 SELECT seq, seq from seq_1_to_10;
ANALYZE TABLE t1 PERSISTENT FOR ALL;
@@ -812,9 +834,9 @@ Table Op Msg_type Msg_text
test.t2 analyze status Engine-independent statistics collected
test.t2 analyze status OK
EXPLAIN
-SELECT * FROM t1,t2 WHERE t1.a= t2.a AND t1.b= t2.b;
+SELECT * FROM t1,t2 WHERE t1.a= t2.a AND t1.b= t2.b ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 10
+1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using temporary; Using filesort
1 SIMPLE t2 ALL NULL NULL NULL NULL 10 Using where; Using join buffer (flat, BNL join)
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -822,19 +844,14 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN
-SELECT * FROM t1,t2 WHERE t1.a= t2.a AND t1.b= t2.b;
-id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 10
-1 SIMPLE t2 ALL NULL NULL NULL NULL 10 Using where; Using join buffer (flat, BNL join)
#
# Tests with views (using Item_direct_view_ref)
#
CREATE VIEW v1 AS SELECT a, b FROM t1;
-EXPLAIN SELECT * FROM v1,t1 where v1.b = 10 AND v1.b=t1.b;
+EXPLAIN SELECT * FROM v1,t1 where v1.b = 10 AND v1.b=t1.b ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where; Using filesort
1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where
-1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where; Using join buffer (flat, BNL join)
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -846,8 +863,8 @@ DROP VIEW v1;
#
# TESTS to get Number of distinct values(ndv) from rec_per_key
#
-CREATE TABLE t1 (a INT, b INT);
-INSERT INTO t1 SELECT seq, seq FROM seq_1_to_10;
+CREATE TABLE t1 (a INT, b INT, c INT);
+INSERT INTO t1 SELECT seq, seq, seq FROM seq_1_to_10;
ALTER TABLE t1 ADD KEY k1(a);
set @save_use_stat_tables= @@use_stat_tables;
set use_stat_tables='never';
@@ -860,9 +877,9 @@ ANALYZE TABLE t2 PERSISTENT FOR ALL;
Table Op Msg_type Msg_text
test.t2 analyze status Engine-independent statistics collected
test.t2 analyze status Table is already up to date
-EXPLAIN SELECT * FROM t1, t2 where t1.a=t2.a and t2.a<3;
+EXPLAIN SELECT * FROM t1, t2 where t1.a=t2.a and t2.a<3 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 range k1 k1 5 NULL 2 Using index condition
+1 SIMPLE t1 range k1 k1 5 NULL 2 Using index condition; Using filesort
1 SIMPLE t2 ref k1 k1 5 test.t1.a 1
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -875,11 +892,11 @@ DROP TABLE t1,t2;
#
# Tests with multi-component keys
#
-CREATE TABLE t1 (a INT, b INT, KEY(a,b));
-INSERT INTO t1 SELECT seq, seq FROM seq_1_to_10;
-EXPLAIN SELECT * FROM t1 where t1.a<3 AND t1.b < 10;
+CREATE TABLE t1 (a INT, b INT, c INT, KEY(a,b));
+INSERT INTO t1 SELECT seq, seq, seq FROM seq_1_to_10;
+EXPLAIN SELECT * FROM t1 where t1.a<3 AND t1.b < 10 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 range a a 5 NULL 2 Using where; Using index
+1 SIMPLE t1 range a a 5 NULL 2 Using index condition; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -887,9 +904,9 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
false
]
ALTER TABLE t1 ADD KEY k1(a);
-EXPLAIN SELECT * FROM t1 where t1.a<3;
+EXPLAIN SELECT * FROM t1 where t1.a<3 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 range a,k1 a 5 NULL 2 Using where; Using index
+1 SIMPLE t1 range a,k1 k1 5 NULL 2 Using index condition; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -900,13 +917,13 @@ DROP TABLE t1;
#
# Test FOR NOT BETWEEN
#
-CREATE TABLE t1(a INT, b VARCHAR(10), KEY(a));
-INSERT INTO t1 SELECT seq, seq from seq_1_to_20;
+CREATE TABLE t1(a INT, b VARCHAR(10), c INT, KEY(a));
+INSERT INTO t1 SELECT seq, seq, seq from seq_1_to_20;
set optimizer_trace=1;
EXPLAIN
-SELECT * FROM t1 WHERE a NOT BETWEEN 3 AND 5;
+SELECT * FROM t1 WHERE a NOT BETWEEN 3 AND 5 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL a NULL NULL NULL 20 Using where
+1 SIMPLE t1 range a a 5 NULL 17 Using index condition; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -917,9 +934,9 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
# Test FOR NOT IN
#
EXPLAIN
-SELECT * FROM t1 WHERE a NOT IN (1,2,3,4,5);
+SELECT * FROM t1 WHERE a NOT IN (1,2,3,4,5) ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL a NULL NULL NULL 20 Using where
+1 SIMPLE t1 range a a 5 NULL 20 Using index condition; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -931,9 +948,9 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
# For this the range optimizer would not give accurate selectivity estimates
#
EXPLAIN
-SELECT * FROM t1 WHERE a NOT LIKE '1%';
+SELECT * FROM t1 WHERE a NOT LIKE '1%' ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 20 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 20 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -941,8 +958,8 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
false
]
DROP TABLE t1;
-CREATE TABLE t1(a INT, b INT);
-INSERT INTO t1 SELECT seq, seq from seq_1_to_10;
+CREATE TABLE t1(a INT, b INT, c INT);
+INSERT INTO t1 SELECT seq, seq, seq from seq_1_to_10;
set optimizer_trace=1;
SET @save_use_stat_tables= @@use_stat_tables;
SET @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity;
@@ -954,9 +971,9 @@ Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK
SET use_stat_tables='never';
-EXPLAIN SELECT * from t1 WHERE t1.a > 5;
+EXPLAIN SELECT * from t1 WHERE t1.a > 5 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -967,9 +984,9 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
# Here statistics are available from stat tables and statistics can be used for the query
#
SET use_stat_tables='preferably';
-EXPLAIN SELECT * from t1 WHERE t1.a > 5;
+EXPLAIN SELECT * from t1 WHERE t1.a > 5 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -981,9 +998,9 @@ SET optimizer_use_condition_selectivity=1;
# Here statistics are available from stat tables but cannot be used because statistics from
# stat tables are only used when optimizer_use_condition_selectivity > 1
#
-EXPLAIN SELECT * from t1 WHERE t1.a > 5;
+EXPLAIN SELECT * from t1 WHERE t1.a > 5 ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where; Using filesort
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -997,11 +1014,11 @@ SET @@optimizer_use_condition_selectivity= @save_optimizer_use_condition_selecti
# For predicates like these a=a, it would be good to have the removed but for these currently
# we assume with such predicates we don't have accurate estimates for selectivity
#
-EXPLAIN EXTENDED SELECT * FROM t1 WHERE a = a;
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE a = a ORDER BY t1.c LIMIT 5;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 10 100.00 Using where
+1 SIMPLE t1 ALL NULL NULL NULL NULL 10 100.00 Using where; Using filesort
Warnings:
-Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`a` = `test`.`t1`.`a`
+Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c` from `test`.`t1` where `test`.`t1`.`a` = `test`.`t1`.`a` order by `test`.`t1`.`c` limit 5
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -1023,22 +1040,22 @@ test.t1 analyze status Table is already up to date
# DELETING the avg_frequency for column a and b from stat tables
update mysql.column_stats set avg_frequency= NULL
WHERE table_name='t1' AND (column_name='b' OR column_name='a');
-EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=1;
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=1 ORDER BY c LIMIT 5;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ref a a 5 const 1 100.00
+1 SIMPLE t1 ref a a 5 const 1 100.00 Using where; Using filesort
Warnings:
-Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where `test`.`t1`.`a` = 1
+Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where `test`.`t1`.`a` = 1 order by `test`.`t1`.`c` limit 5
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
[
true
]
-EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=1 AND a=b;
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=1 AND a=b ORDER BY c LIMIT 5;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ref a a 5 const 1 100.00 Using where
+1 SIMPLE t1 ref a a 5 const 1 100.00 Using where; Using filesort
Warnings:
-Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where `test`.`t1`.`a` = 1 and `test`.`t1`.`b` = 1
+Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where `test`.`t1`.`a` = 1 and `test`.`t1`.`b` = 1 order by `test`.`t1`.`c` limit 5
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
@@ -1063,12 +1080,12 @@ ANALYZE TABLE t2 PERSISTENT FOR ALL;
Table Op Msg_type Msg_text
test.t2 analyze status Engine-independent statistics collected
test.t2 analyze status OK
-EXPLAIN EXTENDED SELECT * FROM t1,t2 WHERE t1.a= t2.a;
+EXPLAIN EXTENDED SELECT * FROM t1,t2 WHERE t1.a= t2.a ORDER BY t1.b LIMIT 10;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 10 100.00
+1 SIMPLE t1 ALL NULL NULL NULL NULL 10 100.00 Using temporary; Using filesort
1 SIMPLE t2 ALL NULL NULL NULL NULL 10 100.00 Using where; Using join buffer (flat, BNL join)
Warnings:
-Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b` from `test`.`t1` join `test`.`t2` where `test`.`t1`.`a` = `test`.`t2`.`a`
+Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b` from `test`.`t1` join `test`.`t2` where `test`.`t1`.`a` = `test`.`t2`.`a` order by `test`.`t1`.`b` limit 10
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
diff --git a/mysql-test/main/join_cardinality.test b/mysql-test/main/join_cardinality.test
index 3c43a3223dc..f0e532d80b6 100644
--- a/mysql-test/main/join_cardinality.test
+++ b/mysql-test/main/join_cardinality.test
@@ -50,24 +50,24 @@ DROP TABLE t1,t2;
--echo # statistics from indexes
--echo #
-CREATE TABLE t1(a INT, b INT, KEY(a));
-INSERT INTO t1 SELECT seq, seq from seq_1_to_100;
+CREATE TABLE t1(a INT, b INT, c INT, KEY(a));
+INSERT INTO t1 SELECT seq, seq, seq from seq_1_to_100;
-ANALYZE SELECT * from t1 WHERE t1.b > 3 AND t1.a=t1.b;
+ANALYZE SELECT * from t1 WHERE t1.b > 3 AND t1.a=t1.b ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
ANALYZE TABLE t1 PERSISTENT FOR COLUMNS (b) INDEXES ();
-ANALYZE SELECT * from t1 WHERE t1.b > 3 AND t1.a=10;
+ANALYZE SELECT * from t1 WHERE t1.b > 3 AND t1.a=10 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-ANALYZE SELECT * from t1 WHERE t1.b > 3 AND t1.a=t1.b;
+ANALYZE SELECT * from t1 WHERE t1.b > 3 AND t1.a=t1.b ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-ANALYZE SELECT * from t1 WHERE t1.b > 3 OR t1.a=t1.b;
+ANALYZE SELECT * from t1 WHERE t1.b > 3 OR t1.a=t1.b ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -84,10 +84,10 @@ INSERT INTO t1 SELECT seq, seq, seq from seq_1_to_10;
--echo # Tests with LIKE PREDICATES
--echo #
-EXPLAIN SELECT * from t1 WHERE t1.a LIKE '%2%';
+EXPLAIN SELECT * from t1 WHERE t1.a LIKE '%2%' ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * from t1 WHERE t1.a LIKE '2%';
+EXPLAIN SELECT * from t1 WHERE t1.a LIKE '2%' ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -95,11 +95,11 @@ FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # Tests with NULL predicates
--echo #
-EXPLAIN SELECT * from t1 WHERE t1.a IS NULL;
+EXPLAIN SELECT * from t1 WHERE t1.a IS NULL ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * from t1 WHERE t1.a IS NOT NULL;
+EXPLAIN SELECT * from t1 WHERE t1.a IS NOT NULL ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -107,27 +107,27 @@ FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # Tests with </<=/>/>=/BETWEEN
--echo #
-EXPLAIN SELECT * from t1 WHERE t1.a > 5;
+EXPLAIN SELECT * from t1 WHERE t1.a > 5 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * from t1 WHERE 5 < t1.a;
+EXPLAIN SELECT * from t1 WHERE 5 < t1.a ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * from t1 WHERE t1.a >= 10 and t1.b <= 10;
+EXPLAIN SELECT * from t1 WHERE t1.a >= 10 and t1.b <= 10 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * from t1 WHERE t1.a BETWEEN 1 AND 5;
+EXPLAIN SELECT * from t1 WHERE t1.a BETWEEN 1 AND 5 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * from t1 WHERE 5 BETWEEN 1 AND t1.a;
+EXPLAIN SELECT * from t1 WHERE 5 BETWEEN 1 AND t1.a ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * from t1 WHERE 1 BETWEEN t1.a AND t1.b;
+EXPLAIN SELECT * from t1 WHERE 1 BETWEEN t1.a AND t1.b ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -135,21 +135,24 @@ FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # Tests with IN predicate
--echo #
-EXPLAIN SELECT * from t1 WHERE t1.a IN (1,2,3);
+EXPLAIN SELECT * from t1 WHERE t1.a IN (1,2,3) ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * from t1 WHERE (t1.a,t1.b) IN ((1,1), (2,2), (3,3));
+EXPLAIN SELECT * from t1 WHERE (t1.a,t1.b) IN ((1,1), (2,2), (3,3))
+ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
EXPLAIN SELECT * from t1 WHERE
-t1.a=t1.b AND (t1.a,t1.b) IN ((1,1), (2,2), (3,3));
+t1.a=t1.b AND (t1.a,t1.b) IN ((1,1), (2,2), (3,3))
+ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
EXPLAIN SELECT * from t1
-WHERE t1.a=t1.b AND (abs(t1.a),t1.b) IN ((1,1), (2,2), (3,3));
+WHERE t1.a=t1.b AND (abs(t1.a),t1.b) IN ((1,1), (2,2), (3,3))
+ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -157,15 +160,15 @@ FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo # Tests using different functional predicates
--echo #
-EXPLAIN SELECT * from t1 WHERE a < 5 XOR a > 10;
+EXPLAIN SELECT * from t1 WHERE a < 5 XOR a > 10 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * from t1 WHERE abs(a) > 10;
+EXPLAIN SELECT * from t1 WHERE abs(a) > 10 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN SELECT * from t1 WHERE a > 10+1;
+EXPLAIN SELECT * from t1 WHERE a > 10+1 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -185,7 +188,7 @@ mysql.column_stats(db_name, table_name, column_name, nulls_ratio) VALUES ('test'
--echo # estimates from stat tables not available, all the fields should be NOT NULL
--echo #
-EXPLAIN SELECT * from t1 WHERE a < 10;
+EXPLAIN SELECT * from t1 WHERE a < 10 ORDER BY t1.b LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -195,8 +198,8 @@ DROP TABLE t1;
--echo # Using multiple equalities at the top level
--echo #
-CREATE TABLE t1(a INT, b INT);
-INSERT INTO t1 SELECT seq, seq from seq_1_to_10;
+CREATE TABLE t1(a INT, b INT, c INT);
+INSERT INTO t1 SELECT seq, seq, seq from seq_1_to_10;
CREATE TABLE t2(a INT, b INT);
INSERT INTO t2 SELECT seq, seq from seq_1_to_10;
@@ -204,20 +207,17 @@ ANALYZE TABLE t1 PERSISTENT FOR ALL;
ANALYZE TABLE t2 PERSISTENT FOR ALL;
EXPLAIN
-SELECT * FROM t1,t2 WHERE t1.a= t2.a AND t1.b= t2.b;
+SELECT * FROM t1,t2 WHERE t1.a= t2.a AND t1.b= t2.b ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN
-SELECT * FROM t1,t2 WHERE t1.a= t2.a AND t1.b= t2.b;
-
--echo #
--echo # Tests with views (using Item_direct_view_ref)
--echo #
CREATE VIEW v1 AS SELECT a, b FROM t1;
-EXPLAIN SELECT * FROM v1,t1 where v1.b = 10 AND v1.b=t1.b;
+EXPLAIN SELECT * FROM v1,t1 where v1.b = 10 AND v1.b=t1.b ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -229,8 +229,8 @@ DROP VIEW v1;
--echo # TESTS to get Number of distinct values(ndv) from rec_per_key
--echo #
-CREATE TABLE t1 (a INT, b INT);
-INSERT INTO t1 SELECT seq, seq FROM seq_1_to_10;
+CREATE TABLE t1 (a INT, b INT, c INT);
+INSERT INTO t1 SELECT seq, seq, seq FROM seq_1_to_10;
ALTER TABLE t1 ADD KEY k1(a);
set @save_use_stat_tables= @@use_stat_tables;
@@ -240,7 +240,7 @@ analyze table t1;
CREATE TABLE t2 like t1;
INSERT INTO t2 SELECT * FROM t1;
ANALYZE TABLE t2 PERSISTENT FOR ALL;
-EXPLAIN SELECT * FROM t1, t2 where t1.a=t2.a and t2.a<3;
+EXPLAIN SELECT * FROM t1, t2 where t1.a=t2.a and t2.a<3 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
set use_stat_tables=@save_use_stat_tables;
@@ -251,15 +251,15 @@ DROP TABLE t1,t2;
--echo # Tests with multi-component keys
--echo #
-CREATE TABLE t1 (a INT, b INT, KEY(a,b));
-INSERT INTO t1 SELECT seq, seq FROM seq_1_to_10;
+CREATE TABLE t1 (a INT, b INT, c INT, KEY(a,b));
+INSERT INTO t1 SELECT seq, seq, seq FROM seq_1_to_10;
-EXPLAIN SELECT * FROM t1 where t1.a<3 AND t1.b < 10;
+EXPLAIN SELECT * FROM t1 where t1.a<3 AND t1.b < 10 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
ALTER TABLE t1 ADD KEY k1(a);
-EXPLAIN SELECT * FROM t1 where t1.a<3;
+EXPLAIN SELECT * FROM t1 where t1.a<3 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -269,12 +269,12 @@ DROP TABLE t1;
--echo # Test FOR NOT BETWEEN
--echo #
-CREATE TABLE t1(a INT, b VARCHAR(10), KEY(a));
-INSERT INTO t1 SELECT seq, seq from seq_1_to_20;
+CREATE TABLE t1(a INT, b VARCHAR(10), c INT, KEY(a));
+INSERT INTO t1 SELECT seq, seq, seq from seq_1_to_20;
set optimizer_trace=1;
EXPLAIN
-SELECT * FROM t1 WHERE a NOT BETWEEN 3 AND 5;
+SELECT * FROM t1 WHERE a NOT BETWEEN 3 AND 5 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -283,7 +283,7 @@ FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo #
EXPLAIN
-SELECT * FROM t1 WHERE a NOT IN (1,2,3,4,5);
+SELECT * FROM t1 WHERE a NOT IN (1,2,3,4,5) ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -293,14 +293,14 @@ FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo #
EXPLAIN
-SELECT * FROM t1 WHERE a NOT LIKE '1%';
+SELECT * FROM t1 WHERE a NOT LIKE '1%' ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
DROP TABLE t1;
-CREATE TABLE t1(a INT, b INT);
-INSERT INTO t1 SELECT seq, seq from seq_1_to_10;
+CREATE TABLE t1(a INT, b INT, c INT);
+INSERT INTO t1 SELECT seq, seq, seq from seq_1_to_10;
set optimizer_trace=1;
SET @save_use_stat_tables= @@use_stat_tables;
SET @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity;
@@ -313,7 +313,7 @@ ANALYZE TABLE t1 PERSISTENT FOR ALL;
SET use_stat_tables='never';
-EXPLAIN SELECT * from t1 WHERE t1.a > 5;
+EXPLAIN SELECT * from t1 WHERE t1.a > 5 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -322,7 +322,7 @@ FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
--echo #
SET use_stat_tables='preferably';
-EXPLAIN SELECT * from t1 WHERE t1.a > 5;
+EXPLAIN SELECT * from t1 WHERE t1.a > 5 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -333,7 +333,7 @@ SET optimizer_use_condition_selectivity=1;
--echo # stat tables are only used when optimizer_use_condition_selectivity > 1
--echo #
-EXPLAIN SELECT * from t1 WHERE t1.a > 5;
+EXPLAIN SELECT * from t1 WHERE t1.a > 5 ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -347,7 +347,7 @@ SET @@optimizer_use_condition_selectivity= @save_optimizer_use_condition_selecti
--echo # we assume with such predicates we don't have accurate estimates for selectivity
--echo #
-EXPLAIN EXTENDED SELECT * FROM t1 WHERE a = a;
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE a = a ORDER BY t1.c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
@@ -368,11 +368,11 @@ ANALYZE TABLE t1 PERSISTENT FOR ALL;
update mysql.column_stats set avg_frequency= NULL
WHERE table_name='t1' AND (column_name='b' OR column_name='a');
-EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=1;
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=1 ORDER BY c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
-EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=1 AND a=b;
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE a=1 AND a=b ORDER BY c LIMIT 5;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.cardinality_accurate'))
FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index c54e3f9af0a..af63ab7176c 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -8486,7 +8486,7 @@ choose_plan(JOIN *join, table_map join_tables)
Json_writer_object wrapper(thd);
- if (join->conds && (join->sort_nest_possible || thd->trace_started()))
+ if (join->conds && join->sort_nest_possible)
{
bool cardinality_accurate;
SAME_FIELD arg= {NULL, FALSE};