* Undo of range optimizer fix from previous changeset
* Fixed test results. mysql-test/r/index_merge_ror.result: Typo fix mysql-test/r/rowid_order_bdb.result: new index_merge EXPLAIN output format changes mysql-test/r/rowid_order_innodb.result: new index_merge EXPLAIN output format changes sql/opt_range.cc: Undo of previous fix: If cost(full_scan_on_covering_index) < cost(best_range_scan) < cost(full_table_scan) use full_scan_on_covering_index, not best_range_scan. The fix affects read plan choice for more queries then initially anticipated, so I'm reverting it for now, will get back to this later
This commit is contained in:
parent
1ce1880204
commit
2164db3c8c
@ -193,3 +193,4 @@ insert into t2 values ('ab', 'ab', 'uh', 'oh');
|
|||||||
explain select a from t2 where a='ab';
|
explain select a from t2 where a='ab';
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t2 ref a a 6 const 1 Using where
|
1 SIMPLE t2 ref a a 6 const 1 Using where
|
||||||
|
drop table t2;
|
||||||
|
@ -14,7 +14,7 @@ insert into t1 values (-5, 1, 1),
|
|||||||
(10, 1, 1);
|
(10, 1, 1);
|
||||||
explain select * from t1 force index(key1, key2) where key1 < 3 or key2 < 3;
|
explain select * from t1 force index(key1, key2) where key1 < 3 or key2 < 3;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 index_merge key1,key2 key1,key2 5,5 NULL 5 Using where
|
1 SIMPLE t1 index_merge key1,key2 key1,key2 5,5 NULL 5 Using sort_union(key1,key2); Using where
|
||||||
select * from t1 force index(key1, key2) where key1 < 3 or key2 < 3;
|
select * from t1 force index(key1, key2) where key1 < 3 or key2 < 3;
|
||||||
pk1 key1 key2
|
pk1 key1 key2
|
||||||
-100 1 1
|
-100 1 1
|
||||||
|
@ -14,7 +14,7 @@ insert into t1 values (-5, 1, 1),
|
|||||||
(10, 1, 1);
|
(10, 1, 1);
|
||||||
explain select * from t1 force index(key1, key2) where key1 < 3 or key2 < 3;
|
explain select * from t1 force index(key1, key2) where key1 < 3 or key2 < 3;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 index_merge key1,key2 key1,key2 5,5 NULL 6 Using where
|
1 SIMPLE t1 index_merge key1,key2 key1,key2 5,5 NULL 6 Using sort_union(key1,key2); Using where
|
||||||
select * from t1 force index(key1, key2) where key1 < 3 or key2 < 3;
|
select * from t1 force index(key1, key2) where key1 < 3 or key2 < 3;
|
||||||
pk1 key1 key2
|
pk1 key1 key2
|
||||||
-100 1 1
|
-100 1 1
|
||||||
|
@ -1610,17 +1610,6 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
|
|||||||
}
|
}
|
||||||
param.key_parts_end=key_parts;
|
param.key_parts_end=key_parts;
|
||||||
|
|
||||||
/* Calculate cost of full index read for the shortest covering index */
|
|
||||||
if (!head->used_keys.is_clear_all())
|
|
||||||
{
|
|
||||||
int key_for_use= find_shortest_key(head, &head->used_keys);
|
|
||||||
double key_read_time= get_index_only_read_time(¶m, records,
|
|
||||||
key_for_use);
|
|
||||||
DBUG_PRINT("info", ("'all'+'using index' scan will be using key %d, "
|
|
||||||
"read time %g", key_for_use, key_read_time));
|
|
||||||
if (key_read_time < read_time)
|
|
||||||
read_time= key_read_time;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((tree=get_mm_tree(¶m,cond)))
|
if ((tree=get_mm_tree(¶m,cond)))
|
||||||
{
|
{
|
||||||
@ -1683,6 +1672,19 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
|
|||||||
SEL_IMERGE *imerge;
|
SEL_IMERGE *imerge;
|
||||||
TABLE_READ_PLAN *best_conj_trp= NULL, *new_conj_trp;
|
TABLE_READ_PLAN *best_conj_trp= NULL, *new_conj_trp;
|
||||||
LINT_INIT(new_conj_trp); /* no empty index_merge lists possible */
|
LINT_INIT(new_conj_trp); /* no empty index_merge lists possible */
|
||||||
|
|
||||||
|
/* Calculate cost of full index read for the shortest covering index */
|
||||||
|
if (!head->used_keys.is_clear_all())
|
||||||
|
{
|
||||||
|
int key_for_use= find_shortest_key(head, &head->used_keys);
|
||||||
|
double key_read_time= get_index_only_read_time(¶m, records,
|
||||||
|
key_for_use);
|
||||||
|
DBUG_PRINT("info", ("'all'+'using index' scan will be using key %d, "
|
||||||
|
"read time %g", key_for_use, key_read_time));
|
||||||
|
if (key_read_time < read_time)
|
||||||
|
read_time= key_read_time;
|
||||||
|
}
|
||||||
|
|
||||||
DBUG_PRINT("info",("No range reads possible,"
|
DBUG_PRINT("info",("No range reads possible,"
|
||||||
" trying to construct index_merge"));
|
" trying to construct index_merge"));
|
||||||
List_iterator_fast<SEL_IMERGE> it(tree->merges);
|
List_iterator_fast<SEL_IMERGE> it(tree->merges);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user