mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Added keyread_time() to HEAP
The default keyread_time() was optimized for blocks and not suitable for HEAP. The effect was the HEAP prefered table scans over ranges for btree indexes. Fixed also get_sweep_read_cost() for HEAP tables.
This commit is contained in:
@ -145,8 +145,8 @@ teststring
|
||||
teststring
|
||||
select * from t1 where text1='teststring' or text1 >= 'teststring\t';
|
||||
text1
|
||||
teststring
|
||||
teststring
|
||||
teststring
|
||||
select * from t1 order by text1;
|
||||
text1
|
||||
nothing
|
||||
|
@ -178,7 +178,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range btn btn 10 NULL 1 Using where
|
||||
explain select * from t1 where btn like "h%";
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL btn NULL NULL NULL # Using where
|
||||
1 SIMPLE t1 range btn btn 10 NULL # Using where
|
||||
explain select * from t1 where btn like "a%";
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range btn btn 10 NULL 1 Using where
|
||||
|
@ -428,14 +428,14 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range uniq_id uniq_id 8 NULL 2 Using where
|
||||
select 0+a from t1 where a in (869751,736494,226312,802616,728912);
|
||||
0+a
|
||||
869751
|
||||
736494
|
||||
226312
|
||||
802616
|
||||
728912
|
||||
736494
|
||||
802616
|
||||
869751
|
||||
explain select 0+a from t1 where a in (869751,736494,226312,802616,728912);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL uniq_id NULL NULL NULL 5 Using where
|
||||
1 SIMPLE t1 range uniq_id uniq_id 8 NULL 5 Using where
|
||||
drop table t1;
|
||||
End of 5.3 tests
|
||||
#
|
||||
|
@ -2675,11 +2675,13 @@ double handler::keyread_time(uint index, uint ranges, ha_rows rows)
|
||||
size_t len= table->key_info[index].key_length + ref_length;
|
||||
if (index == table->s->primary_key && table->file->primary_key_is_clustered())
|
||||
len= table->s->stored_rec_length;
|
||||
uint keys_per_block= (uint) (stats.block_size/2.0/len+1);
|
||||
ulonglong blocks= !rows ? 0 : (rows-1) / keys_per_block + 1;
|
||||
double cost= (double)rows*len/(stats.block_size+1)*IDX_BLOCK_COPY_COST;
|
||||
if (ranges)
|
||||
{
|
||||
uint keys_per_block= (uint) (stats.block_size/2.0/len+1);
|
||||
ulonglong blocks= !rows ? 0 : (rows-1) / keys_per_block + 1;
|
||||
cost+= blocks;
|
||||
}
|
||||
return cost;
|
||||
}
|
||||
|
||||
|
@ -4897,7 +4897,8 @@ double get_sweep_read_cost(const PARAM *param, ha_rows records)
|
||||
{
|
||||
double result;
|
||||
DBUG_ENTER("get_sweep_read_cost");
|
||||
if (param->table->file->primary_key_is_clustered())
|
||||
if (param->table->file->primary_key_is_clustered() ||
|
||||
param->table->file->stats.block_size == 0 /* HEAP */)
|
||||
{
|
||||
/*
|
||||
We are using the primary key to find the rows.
|
||||
|
@ -65,8 +65,9 @@ public:
|
||||
double scan_time()
|
||||
{ return (double) (stats.records+stats.deleted) / 20.0+10; }
|
||||
double read_time(uint index, uint ranges, ha_rows rows)
|
||||
{ return (double) rows / 20.0+1; }
|
||||
|
||||
{ return (double) rows / 20.0+1; }
|
||||
double keyread_time(uint index, uint ranges, ha_rows rows)
|
||||
{ return (double) rows / 20.0+1; }
|
||||
int open(const char *name, int mode, uint test_if_locked);
|
||||
int close(void);
|
||||
void set_keys_for_scanning(void);
|
||||
|
Reference in New Issue
Block a user