mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
875377ad82
We use a bool to indicate that the key part used is a descending index, which will flip the functions and flags used in get_index_max_value() and get_index_min_value(), that allows correct optimization for max/min for descending index.
179 lines
6.6 KiB
Text
179 lines
6.6 KiB
Text
#
|
|
# MDEV-27576 Use DESC indexes for MIN/MAX optimization
|
|
#
|
|
create or replace table t1 (a int, key(a desc)) engine=innodb;
|
|
insert into t1 select seq * 2 from seq_1_to_100 order by rand(1);
|
|
explain select max(a) from t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select max(a) from t1;
|
|
max(a)
|
|
200
|
|
explain select min(a) from t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select min(a) from t1;
|
|
min(a)
|
|
2
|
|
explain select max(a) from t1 where a < 100;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select max(a) from t1 where a < 100;
|
|
max(a)
|
|
98
|
|
explain select min(a) from t1 where a > 100;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select min(a) from t1 where a > 100;
|
|
min(a)
|
|
102
|
|
explain select max(a) from t1 where a <= 100;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select max(a) from t1 where a <= 100;
|
|
max(a)
|
|
100
|
|
explain select min(a) from t1 where a >= 100;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select min(a) from t1 where a >= 100;
|
|
min(a)
|
|
100
|
|
explain select max(a) from t1 where a <= 99;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select max(a) from t1 where a <= 99;
|
|
max(a)
|
|
98
|
|
explain select min(a) from t1 where a >= 99;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select min(a) from t1 where a >= 99;
|
|
min(a)
|
|
100
|
|
explain select max(a) from t1 where a > 100;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select max(a) from t1 where a > 100;
|
|
max(a)
|
|
200
|
|
explain select max(a) from t1 where a > 1000;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No matching min/max row
|
|
select max(a) from t1 where a > 1000;
|
|
max(a)
|
|
NULL
|
|
explain select min(a) from t1 where a < 100;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select min(a) from t1 where a < 100;
|
|
min(a)
|
|
2
|
|
explain select min(a) from t1 where a < 0;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No matching min/max row
|
|
select min(a) from t1 where a < 0;
|
|
min(a)
|
|
NULL
|
|
explain select max(a) from t1 where a >= 100;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select max(a) from t1 where a >= 100;
|
|
max(a)
|
|
200
|
|
explain select max(a) from t1 where a >= 1000;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No matching min/max row
|
|
select max(a) from t1 where a >= 1000;
|
|
max(a)
|
|
NULL
|
|
explain select min(a) from t1 where a <= 100;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select min(a) from t1 where a <= 100;
|
|
min(a)
|
|
2
|
|
explain select min(a) from t1 where a <= 0;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No matching min/max row
|
|
select min(a) from t1 where a <= 0;
|
|
min(a)
|
|
NULL
|
|
explain select max(a) from t1 where a >= 99;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select max(a) from t1 where a >= 99;
|
|
max(a)
|
|
200
|
|
explain select min(a) from t1 where a <= 99;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select min(a) from t1 where a <= 99;
|
|
min(a)
|
|
2
|
|
explain select max(200 - a) from t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL a 5 NULL 100 Using index
|
|
select max(200 - a) from t1;
|
|
max(200 - a)
|
|
198
|
|
explain select min(200 - a) from t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL a 5 NULL 100 Using index
|
|
select min(200 - a) from t1;
|
|
min(200 - a)
|
|
0
|
|
create or replace table t1 (a int, b int, key(a desc, b asc)) engine=innodb;
|
|
insert into t1 select seq * 2, seq * 2 from seq_1_to_100 order by rand(1);
|
|
explain select max(a) from t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select max(a) from t1;
|
|
max(a)
|
|
200
|
|
explain select min(a) from t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select min(a) from t1;
|
|
min(a)
|
|
2
|
|
create or replace table t1 (a int, b int, key(a asc), key (b desc)) engine=innodb;
|
|
insert into t1 select seq * 2, seq * 2 from seq_1_to_100 order by rand(1);
|
|
explain select max(b) from t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select max(b) from t1;
|
|
max(b)
|
|
200
|
|
explain select min(b) from t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select min(b) from t1;
|
|
min(b)
|
|
2
|
|
create or replace table t1 (a int, b int, key (b desc)) engine=innodb;
|
|
insert into t1 select seq * 2, seq * 2 from seq_1_to_100 order by rand(1);
|
|
explain select max(b) from t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select max(b) from t1;
|
|
max(b)
|
|
200
|
|
explain select min(b) from t1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
select min(b) from t1;
|
|
min(b)
|
|
2
|
|
CREATE OR REPLACE TABLE t1 (a FLOAT, KEY (a DESC));
|
|
INSERT INTO t1 VALUES (0.1234),(0.6789);
|
|
explain SELECT MAX(a) FROM t1 WHERE a <= 0.6789;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
|
SELECT MAX(a) FROM t1 WHERE a <= 0.6789;
|
|
MAX(a)
|
|
0.6789
|
|
drop table t1;
|
|
#
|
|
# end of test 11.4
|
|
#
|