mirror of
https://github.com/MariaDB/server.git
synced 2025-01-21 06:22:28 +01:00
dff98a8ef7
* 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
84 lines
2.4 KiB
Text
84 lines
2.4 KiB
Text
#
|
|
# Clustered PK ROR-index_merge tests
|
|
#
|
|
-- source include/have_innodb.inc
|
|
|
|
--disable_warnings
|
|
drop table if exists t1;
|
|
--enable_warnings
|
|
|
|
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;
|
|
|
|
--disable_query_log
|
|
set autocommit=0;
|
|
let $1=10000;
|
|
while ($1)
|
|
{
|
|
eval insert into t1 values ($1 div 10,$1 mod 100, $1/100,$1/100, $1/100,$1/100,$1/100,$1/100,$1/100, $1 mod 100, $1/1000,'filler-data-$1','filler2');
|
|
dec $1;
|
|
}
|
|
set autocommit=1;
|
|
--enable_query_log
|
|
|
|
# Verify that range scan on CPK is ROR
|
|
# (use index_intersection because it is impossible to check that for index union)
|
|
explain select * from t1 where pk1 = 1 and pk2 < 80 and key1=0;
|
|
# CPK scan + 1 ROR range scan is a special case
|
|
select * from t1 where pk1 = 1 and pk2 < 80 and key1=0;
|
|
|
|
# Verify that CPK fields are considered to be covered by index scans
|
|
explain select pk1,pk2 from t1 where key1 = 10 and key2=10 and 2*pk1+1 < 2*96+1;
|
|
select pk1,pk2 from t1 where key1 = 10 and key2=10 and 2*pk1+1 < 2*96+1;
|
|
|
|
# Verify that CPK is always used for index intersection scans
|
|
# (this is because it is used as a filter, not for retrieval)
|
|
explain select * from t1 where badkey=1 and key1=10;
|
|
explain select * from t1 where pk1 < 7500 and key1 = 10;
|
|
|
|
# Verify that keys with 'tails' of PK members are ok.
|
|
explain select * from t1 where pktail1ok=1 and key1=10;
|
|
explain select * from t1 where pktail2ok=1 and key1=10;
|
|
|
|
select ' The following is actually a deficiency, it uses sort_union currently:' as 'note:';
|
|
explain select * from t1 where (pktail2ok=1 and pk1< 50000) or key1=10;
|
|
|
|
explain select * from t1 where pktail3bad=1 and key1=10;
|
|
explain select * from t1 where pktail4bad=1 and key1=10;
|
|
explain select * from t1 where pktail5bad=1 and key1=10;
|
|
|
|
# Test for problem with innodb key values prefetch buffer:
|
|
explain select pk1,pk2,key1,key2 from t1 where key1 = 10 and key2=10 limit 10;
|
|
select pk1,pk2,key1,key2 from t1 where key1 = 10 and key2=10 limit 10;
|
|
|
|
drop table t1;
|
|
|