mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-30 18:36:12 +01:00 
			
		
		
		
	 875377ad82
			
		
	
	
	
	
	875377ad82We 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
 | |
| #
 |