mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
658128af43
This patch contains a full implementation of the optimization
that allows to use in-memory rowid / primary filters built for range
conditions over indexes. In many cases usage of such filters reduce
the number of disk seeks spent for fetching table rows.
In this implementation the choice of what possible filter to be applied
(if any) is made purely on cost-based considerations.
This implementation re-achitectured the partial implementation of
the feature pushed by Galina Shalygina in the commit
8d5a11122c
.
Besides this patch contains a better implementation of the generic
handler function handler::multi_range_read_info_const() that
takes into account gaps between ranges when calculating the cost of
range index scans. It also contains some corrections of the
implementation of the handler function records_in_range() for MyISAM.
This patch supports the feature for InnoDB and MyISAM.
169 lines
3.8 KiB
Text
169 lines
3.8 KiB
Text
drop table if exists t1, t2;
|
|
create table t1 (
|
|
a int not null auto_increment,
|
|
b char(16) not null,
|
|
primary key (a),
|
|
key (b)
|
|
);
|
|
create table t2(
|
|
a int not null auto_increment,
|
|
b char(16) not null,
|
|
primary key (a),
|
|
key (b)
|
|
);
|
|
insert into t1(b) values
|
|
('test0'),
|
|
('test1'),
|
|
('test2'),
|
|
('test3'),
|
|
('test4'),
|
|
('test5'),
|
|
('test6'),
|
|
('test7');
|
|
insert into t2(b) select b from t1;
|
|
insert into t1(b) select b from t2;
|
|
insert into t2(b) select b from t1;
|
|
insert into t1(b) select b from t2;
|
|
insert into t2(b) select b from t1;
|
|
insert into t1(b) select b from t2;
|
|
insert into t2(b) select b from t1;
|
|
insert into t1(b) select b from t2;
|
|
insert into t2(b) select b from t1;
|
|
insert into t1(b) select b from t2;
|
|
insert into t2(b) select b from t1;
|
|
insert into t1(b) select b from t2;
|
|
insert into t2(b) select b from t1;
|
|
insert into t1(b) select b from t2;
|
|
insert into t2(b) select b from t1;
|
|
insert into t1(b) select b from t2;
|
|
insert into t2(b) select b from t1;
|
|
insert into t1(b) select b from t2;
|
|
select count(*) from t1;
|
|
count(*)
|
|
33448
|
|
select count(*) from t2;
|
|
count(*)
|
|
20672
|
|
flush tables;
|
|
flush status;
|
|
show status like "key_read%";
|
|
Variable_name Value
|
|
Key_read_requests 0
|
|
Key_reads 0
|
|
select count(*) from t1 where b = 'test1';
|
|
count(*)
|
|
4181
|
|
show status like "key_read%";
|
|
Variable_name Value
|
|
Key_read_requests 297
|
|
Key_reads 60
|
|
select count(*) from t1 where b = 'test1';
|
|
count(*)
|
|
4181
|
|
show status like "key_read%";
|
|
Variable_name Value
|
|
Key_read_requests 594
|
|
Key_reads 60
|
|
flush tables;
|
|
flush status;
|
|
select @@preload_buffer_size;
|
|
@@preload_buffer_size
|
|
32768
|
|
load index into cache t1;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 preload_keys status OK
|
|
show status like "key_read%";
|
|
Variable_name Value
|
|
Key_read_requests 774
|
|
Key_reads 774
|
|
select count(*) from t1 where b = 'test1';
|
|
count(*)
|
|
4181
|
|
show status like "key_read%";
|
|
Variable_name Value
|
|
Key_read_requests 1071
|
|
Key_reads 774
|
|
flush tables;
|
|
flush status;
|
|
show status like "key_read%";
|
|
Variable_name Value
|
|
Key_read_requests 0
|
|
Key_reads 0
|
|
set session preload_buffer_size=256*1024;
|
|
select @@preload_buffer_size;
|
|
@@preload_buffer_size
|
|
262144
|
|
load index into cache t1 ignore leaves;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 preload_keys status OK
|
|
show status like "key_read%";
|
|
Variable_name Value
|
|
Key_read_requests 17
|
|
Key_reads 17
|
|
select count(*) from t1 where b = 'test1';
|
|
count(*)
|
|
4181
|
|
show status like "key_read%";
|
|
Variable_name Value
|
|
Key_read_requests 314
|
|
Key_reads 75
|
|
flush tables;
|
|
flush status;
|
|
show status like "key_read%";
|
|
Variable_name Value
|
|
Key_read_requests 0
|
|
Key_reads 0
|
|
set session preload_buffer_size=1*1024;
|
|
select @@preload_buffer_size;
|
|
@@preload_buffer_size
|
|
1024
|
|
load index into cache t1, t2 key (primary,b) ignore leaves;
|
|
Table Op Msg_type Msg_text
|
|
test.t1 preload_keys status OK
|
|
test.t2 preload_keys status OK
|
|
show status like "key_read%";
|
|
Variable_name Value
|
|
Key_read_requests 785
|
|
Key_reads 785
|
|
select count(*) from t1 where b = 'test1';
|
|
count(*)
|
|
4181
|
|
select count(*) from t2 where b = 'test1';
|
|
count(*)
|
|
2584
|
|
show status like "key_read%";
|
|
Variable_name Value
|
|
Key_read_requests 1272
|
|
Key_reads 821
|
|
flush tables;
|
|
flush status;
|
|
show status like "key_read%";
|
|
Variable_name Value
|
|
Key_read_requests 0
|
|
Key_reads 0
|
|
load index into cache t3, t2 key (primary,b) ;
|
|
Table Op Msg_type Msg_text
|
|
test.t3 preload_keys Error Table 'test.t3' doesn't exist
|
|
test.t3 preload_keys status Operation failed
|
|
test.t2 preload_keys status OK
|
|
show status like "key_read%";
|
|
Variable_name Value
|
|
Key_read_requests 478
|
|
Key_reads 478
|
|
flush tables;
|
|
flush status;
|
|
show status like "key_read%";
|
|
Variable_name Value
|
|
Key_read_requests 0
|
|
Key_reads 0
|
|
load index into cache t3 key (b), t2 key (c) ;
|
|
Table Op Msg_type Msg_text
|
|
test.t3 preload_keys Error Table 'test.t3' doesn't exist
|
|
test.t3 preload_keys status Operation failed
|
|
test.t2 preload_keys Error Key 'c' doesn't exist in table 't2'
|
|
test.t2 preload_keys status Operation failed
|
|
show status like "key_read%";
|
|
Variable_name Value
|
|
Key_read_requests 0
|
|
Key_reads 0
|
|
drop table t1, t2;
|