mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
1ce1880204
* Fixed a problem with wrong query results for partially covering keys in ROR-index_merge * ROR-intersection retrieval plan choice algorithm now uses less disk IO - and properly processes clustered PK range scans * Fixed several minor range optimizer problems * Added more comments * Code cleanup mysql-test/r/index_merge.result: New index_merge EXPLAIN output format changes mysql-test/r/index_merge_innodb.result: New index_merge EXPLAIN output format changes mysql-test/r/index_merge_ror.result: New index_merge EXPLAIN output format changes Added test for scans on keys that cover fields partially Fixed a minor ROR optimizer problem mysql-test/r/index_merge_ror_cpk.result: More tests added mysql-test/t/index_merge_ror.test: New index_merge EXPLAIN output format changes Added test for scans on keys that cover fields partially Fixed a minor ROR optimizer problem mysql-test/t/index_merge_ror_cpk.test: More tests added mysys/my_bitmap.c: Comments added, code cleanup sql/opt_range.cc: Comments added, code cleanup Numerous fixes, see changeset description sql/opt_range.h: Comments added, code cleanup New index_merge EXPLAIN output format related changes sql/sql_select.cc: Comments added, code cleanup New index_merge EXPLAIN output
99 lines
4 KiB
Text
99 lines
4 KiB
Text
drop table if exists t1;
|
|
create table t1
|
|
(
|
|
pk1 int not null,
|
|
pk2 int not null,
|
|
key1 int not null,
|
|
key2 int not null,
|
|
pktail1ok int not null,
|
|
pktail2ok int not null,
|
|
pktail3bad int not null,
|
|
pktail4bad int not null,
|
|
pktail5bad int not null,
|
|
pk2copy int not null,
|
|
badkey int not null,
|
|
filler1 char (200),
|
|
filler2 char (200),
|
|
key (key1),
|
|
key (key2),
|
|
/* keys with tails from CPK members */
|
|
key (pktail1ok, pk1),
|
|
key (pktail2ok, pk1, pk2),
|
|
key (pktail3bad, pk2, pk1),
|
|
key (pktail4bad, pk1, pk2copy),
|
|
key (pktail5bad, pk1, pk2, pk2copy),
|
|
primary key (pk1, pk2)
|
|
) engine=innodb;
|
|
explain select * from t1 where pk1 = 1 and pk2 < 80 and key1=0;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ref PRIMARY,key1 PRIMARY 4 const 1 Using where
|
|
select * from t1 where pk1 = 1 and pk2 < 80 and key1=0;
|
|
pk1 pk2 key1 key2 pktail1ok pktail2ok pktail3bad pktail4bad pktail5bad pk2copy badkey filler1 filler2
|
|
1 10 0 0 0 0 0 0 0 10 0 filler-data-10 filler2
|
|
1 11 0 0 0 0 0 0 0 11 0 filler-data-11 filler2
|
|
1 12 0 0 0 0 0 0 0 12 0 filler-data-12 filler2
|
|
1 13 0 0 0 0 0 0 0 13 0 filler-data-13 filler2
|
|
1 14 0 0 0 0 0 0 0 14 0 filler-data-14 filler2
|
|
1 15 0 0 0 0 0 0 0 15 0 filler-data-15 filler2
|
|
1 16 0 0 0 0 0 0 0 16 0 filler-data-16 filler2
|
|
1 17 0 0 0 0 0 0 0 17 0 filler-data-17 filler2
|
|
1 18 0 0 0 0 0 0 0 18 0 filler-data-18 filler2
|
|
1 19 0 0 0 0 0 0 0 19 0 filler-data-19 filler2
|
|
explain select pk1,pk2 from t1 where key1 = 10 and key2=10 and 2*pk1+1 < 2*96+1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index_merge key1,key2 key1,key2 4,4 NULL 1 Using intersect(key1,key2); Using where; Using index
|
|
select pk1,pk2 from t1 where key1 = 10 and key2=10 and 2*pk1+1 < 2*96+1;
|
|
pk1 pk2
|
|
95 50
|
|
95 51
|
|
95 52
|
|
95 53
|
|
95 54
|
|
95 55
|
|
95 56
|
|
95 57
|
|
95 58
|
|
95 59
|
|
explain select * from t1 where badkey=1 and key1=10;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ref key1 key1 4 const 101 Using where
|
|
explain select * from t1 where pk1 < 7500 and key1 = 10;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index_merge PRIMARY,key1 key1,PRIMARY 4,4 NULL 38 Using intersect(key1,PRIMARY); Using where
|
|
explain select * from t1 where pktail1ok=1 and key1=10;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index_merge key1,pktail1ok key1,pktail1ok 4,4 NULL 1 Using intersect(key1,pktail1ok); Using where
|
|
explain select * from t1 where pktail2ok=1 and key1=10;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index_merge key1,pktail2ok key1,pktail2ok 4,4 NULL 1 Using intersect(key1,pktail2ok); Using where
|
|
select ' The following is actually a deficiency, it uses sort_union currently:' as 'note:';
|
|
note:
|
|
The following is actually a deficiency, it uses sort_union currently:
|
|
explain select * from t1 where (pktail2ok=1 and pk1< 50000) or key1=10;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index_merge PRIMARY,key1,pktail2ok pktail2ok,key1 8,4 NULL 199 Using sort_union(pktail2ok,key1); Using where
|
|
explain select * from t1 where pktail3bad=1 and key1=10;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ref key1,pktail3bad pktail3bad 4 const 98 Using where
|
|
explain select * from t1 where pktail4bad=1 and key1=10;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ref key1,pktail4bad pktail4bad 4 const 99 Using where
|
|
explain select * from t1 where pktail5bad=1 and key1=10;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ref key1,pktail5bad pktail5bad 4 const 99 Using where
|
|
explain select pk1,pk2,key1,key2 from t1 where key1 = 10 and key2=10 limit 10;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 index_merge key1,key2 key1,key2 4,4 NULL 1 Using intersect(key1,key2); Using where; Using index
|
|
select pk1,pk2,key1,key2 from t1 where key1 = 10 and key2=10 limit 10;
|
|
pk1 pk2 key1 key2
|
|
95 50 10 10
|
|
95 51 10 10
|
|
95 52 10 10
|
|
95 53 10 10
|
|
95 54 10 10
|
|
95 55 10 10
|
|
95 56 10 10
|
|
95 57 10 10
|
|
95 58 10 10
|
|
95 59 10 10
|
|
drop table t1;
|