mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 12:32:27 +01:00
c90493749a
This patch adds cost estimation for the queries with ORDER BY / GROUP BY and LIMIT. If there was a ref/range access to the table whose rows were required to be ordered in the result set the optimizer always employed this access though a scan by a different index that was compatible with the required order could be cheaper to produce the first L rows of the result set. Now for such queries the optimizer makes a choice between the cheapest ref/range accesses not compatible with the given order and index scans compatible with it. mysql-test/r/distinct.result: Adjusted results for test cases affected fy the fix for bug #28404. mysql-test/r/endspace.result: Adjusted results for test cases affected fy the fix for bug #28404. mysql-test/r/group_by.result: Adjusted results for test cases affected fy the fix for bug #28404. mysql-test/r/group_min_max.result: Adjusted results for test cases affected fy the fix for bug #28404. mysql-test/r/innodb.result: Adjusted results for test cases affected fy the fix for bug #28404. mysql-test/r/innodb_mysql.result: Adjusted results for test cases affected fy the fix for bug #28404. mysql-test/r/merge.result: Adjusted results for test cases affected fy the fix for bug #28404. mysql-test/r/order_by.result: Added a test case for bug #28404. mysql-test/r/select_found.result: Adjusted results for test cases affected fy the fix for bug #28404. mysql-test/r/subselect.result: Adjusted results for test cases affected fy the fix for bug #28404. mysql-test/t/distinct.test: Changed a test case after adding the fix for bug #28404. mysql-test/t/order_by.test: Added a test case for bug #28404. sql/sql_select.cc: Fixed bug#28404. This patch adds cost estimation for the queries with ORDER BY / GROUP BY and LIMIT. Now for such queries the optimizer makes a choice between the cheapest ref/range accesses not compatible with the given order and index scans compatible with it. Modified the function test_if_skip_sort_order to make the above mentioned choice cost based. sql/sql_select.h: Fixed bug#28404. This patch adds cost estimation for the queries with ORDER BY / GROUP BY and LIMIT. Added a new field fot the JOIN_TAB structure.
220 lines
6.6 KiB
Text
220 lines
6.6 KiB
Text
drop table if exists t1;
|
|
select 'a' = 'a', 'a' = 'a ', 'a ' = 'a';
|
|
'a' = 'a' 'a' = 'a ' 'a ' = 'a'
|
|
1 1 1
|
|
select 'a\0' = 'a', 'a\0' < 'a', 'a\0' > 'a';
|
|
'a\0' = 'a' 'a\0' < 'a' 'a\0' > 'a'
|
|
0 1 0
|
|
select 'a' = 'a\0', 'a' < 'a\0', 'a' > 'a\0';
|
|
'a' = 'a\0' 'a' < 'a\0' 'a' > 'a\0'
|
|
0 0 1
|
|
select 'a\0' = 'a ', 'a\0' < 'a ', 'a\0' > 'a ';
|
|
'a\0' = 'a ' 'a\0' < 'a ' 'a\0' > 'a '
|
|
0 1 0
|
|
select 'a ' = 'a\0', 'a ' < 'a\0', 'a ' > 'a\0';
|
|
'a ' = 'a\0' 'a ' < 'a\0' 'a ' > 'a\0'
|
|
0 0 1
|
|
select 'a a' > 'a', 'a \0' < 'a';
|
|
'a a' > 'a' 'a \0' < 'a'
|
|
1 1
|
|
select binary 'a a' > 'a', binary 'a \0' > 'a', binary 'a\0' > 'a';
|
|
binary 'a a' > 'a' binary 'a \0' > 'a' binary 'a\0' > 'a'
|
|
1 1 1
|
|
create table t1 (text1 varchar(32) not NULL, KEY key1 (text1));
|
|
insert into t1 values ('teststring'), ('nothing'), ('teststring\t');
|
|
check table t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 check status OK
|
|
select * from t1 ignore key (key1) where text1='teststring' or
|
|
text1 like 'teststring_%' ORDER BY text1;
|
|
text1
|
|
teststring
|
|
teststring
|
|
select * from t1 where text1='teststring' or text1 like 'teststring_%';
|
|
text1
|
|
teststring
|
|
teststring
|
|
select * from t1 where text1='teststring' or text1 > 'teststring\t';
|
|
text1
|
|
teststring
|
|
select * from t1 order by text1;
|
|
text1
|
|
nothing
|
|
teststring
|
|
teststring
|
|
explain select * from t1 order by text1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL key1 34 NULL 3 Using index
|
|
alter table t1 modify text1 char(32) binary not null;
|
|
check table t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 check status OK
|
|
select * from t1 ignore key (key1) where text1='teststring' or
|
|
text1 like 'teststring_%' ORDER BY text1;
|
|
text1
|
|
teststring
|
|
teststring
|
|
select concat('|', text1, '|') from t1 where text1='teststring' or text1 like 'teststring_%';
|
|
concat('|', text1, '|')
|
|
|teststring |
|
|
|teststring|
|
|
select concat('|', text1, '|') from t1 where text1='teststring' or text1 > 'teststring\t';
|
|
concat('|', text1, '|')
|
|
|teststring|
|
|
select text1, length(text1) from t1 order by text1;
|
|
text1 length(text1)
|
|
nothing 7
|
|
teststring 11
|
|
teststring 10
|
|
select text1, length(text1) from t1 order by binary text1;
|
|
text1 length(text1)
|
|
nothing 7
|
|
teststring 10
|
|
teststring 11
|
|
alter table t1 modify text1 blob not null, drop key key1, add key key1 (text1(20));
|
|
insert into t1 values ('teststring ');
|
|
select concat('|', text1, '|') from t1 order by text1;
|
|
concat('|', text1, '|')
|
|
|nothing|
|
|
|teststring|
|
|
|teststring |
|
|
|teststring |
|
|
select concat('|', text1, '|') from t1 where text1='teststring' or text1 > 'teststring\t';
|
|
concat('|', text1, '|')
|
|
|teststring|
|
|
|teststring |
|
|
select concat('|', text1, '|') from t1 where text1='teststring';
|
|
concat('|', text1, '|')
|
|
|teststring|
|
|
select concat('|', text1, '|') from t1 where text1='teststring ';
|
|
concat('|', text1, '|')
|
|
|teststring |
|
|
alter table t1 modify text1 text not null, pack_keys=1;
|
|
select concat('|', text1, '|') from t1 where text1='teststring';
|
|
concat('|', text1, '|')
|
|
|teststring|
|
|
|teststring |
|
|
select concat('|', text1, '|') from t1 where text1='teststring ';
|
|
concat('|', text1, '|')
|
|
|teststring|
|
|
|teststring |
|
|
explain select concat('|', text1, '|') from t1 where text1='teststring ';
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ref key1 key1 22 const 2 Using where
|
|
select concat('|', text1, '|') from t1 where text1 like 'teststring_%';
|
|
concat('|', text1, '|')
|
|
|teststring |
|
|
|teststring |
|
|
select concat('|', text1, '|') from t1 where text1='teststring' or text1 like 'teststring_%';
|
|
concat('|', text1, '|')
|
|
|teststring |
|
|
|teststring|
|
|
|teststring |
|
|
select concat('|', text1, '|') from t1 where text1='teststring' or text1 > 'teststring\t';
|
|
concat('|', text1, '|')
|
|
|teststring|
|
|
|teststring |
|
|
select concat('|', text1, '|') from t1 order by text1;
|
|
concat('|', text1, '|')
|
|
|nothing|
|
|
|teststring |
|
|
|teststring|
|
|
|teststring |
|
|
drop table t1;
|
|
create table t1 (text1 varchar(32) not NULL, KEY key1 (text1)) pack_keys=0;
|
|
insert into t1 values ('teststring'), ('nothing'), ('teststring\t');
|
|
select concat('|', text1, '|') from t1 where text1='teststring' or text1 like 'teststring_%';
|
|
concat('|', text1, '|')
|
|
|teststring |
|
|
|teststring|
|
|
select concat('|', text1, '|') from t1 where text1='teststring' or text1 >= 'teststring\t';
|
|
concat('|', text1, '|')
|
|
|teststring |
|
|
|teststring|
|
|
drop table t1;
|
|
create table t1 (text1 varchar(32) not NULL, KEY key1 using BTREE (text1)) engine=heap;
|
|
insert into t1 values ('teststring'), ('nothing'), ('teststring\t');
|
|
select * from t1 ignore key (key1) where text1='teststring' or
|
|
text1 like 'teststring_%' ORDER BY text1;
|
|
text1
|
|
teststring
|
|
teststring
|
|
select * from t1 where text1='teststring' or text1 like 'teststring_%';
|
|
text1
|
|
teststring
|
|
teststring
|
|
select * from t1 where text1='teststring' or text1 >= 'teststring\t';
|
|
text1
|
|
teststring
|
|
teststring
|
|
select * from t1 order by text1;
|
|
text1
|
|
nothing
|
|
teststring
|
|
teststring
|
|
explain select * from t1 order by text1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using filesort
|
|
alter table t1 modify text1 char(32) binary not null;
|
|
select * from t1 order by text1;
|
|
text1
|
|
nothing
|
|
teststring
|
|
teststring
|
|
drop table t1;
|
|
create table t1 (text1 varchar(32) not NULL, KEY key1 (text1)) engine=innodb;
|
|
insert into t1 values ('teststring'), ('nothing'), ('teststring\t');
|
|
check table t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 check status OK
|
|
select * from t1 where text1='teststring' or text1 like 'teststring_%';
|
|
text1
|
|
teststring
|
|
teststring
|
|
select * from t1 where text1='teststring' or text1 > 'teststring\t';
|
|
text1
|
|
teststring
|
|
select * from t1 order by text1;
|
|
text1
|
|
nothing
|
|
teststring
|
|
teststring
|
|
explain select * from t1 order by text1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index NULL key1 34 NULL 3 Using index
|
|
alter table t1 modify text1 char(32) binary not null;
|
|
select * from t1 order by text1;
|
|
text1
|
|
nothing
|
|
teststring
|
|
teststring
|
|
alter table t1 modify text1 blob not null, drop key key1, add key key1 (text1(20));
|
|
insert into t1 values ('teststring ');
|
|
select concat('|', text1, '|') from t1 order by text1;
|
|
concat('|', text1, '|')
|
|
|nothing|
|
|
|teststring|
|
|
|teststring |
|
|
|teststring |
|
|
alter table t1 modify text1 text not null, pack_keys=1;
|
|
select * from t1 where text1 like 'teststring_%';
|
|
text1
|
|
teststring
|
|
teststring
|
|
select text1, length(text1) from t1 where text1='teststring' or text1 like 'teststring_%';
|
|
text1 length(text1)
|
|
teststring 11
|
|
teststring 10
|
|
teststring 11
|
|
select text1, length(text1) from t1 where text1='teststring' or text1 >= 'teststring\t';
|
|
text1 length(text1)
|
|
teststring 11
|
|
teststring 10
|
|
teststring 11
|
|
select concat('|', text1, '|') from t1 order by text1;
|
|
concat('|', text1, '|')
|
|
|nothing|
|
|
|teststring |
|
|
|teststring|
|
|
|teststring |
|
|
drop table t1;
|