541
546
my_bitmap_map *tmp;
543
548
param->tmp_covered_fields.setBitmap(0);
544
param->fields_bitmap_size= table->s->column_bitmap_size;
545
if (!(tmp= (my_bitmap_map*) alloc_root(param->mem_root,
546
param->fields_bitmap_size)) ||
547
param->needed_fields.init(tmp, table->s->fields))
549
param->fields_bitmap_size= table->getShare()->column_bitmap_size;
550
if (!(tmp= (my_bitmap_map*) param->mem_root->alloc_root(param->fields_bitmap_size)) ||
551
param->needed_fields.init(tmp, table->getShare()->sizeFields()))
550
556
param->needed_fields= *table->read_set;
551
557
bitmap_union(¶m->needed_fields, table->write_set);
553
pk= param->table->s->primary_key;
559
pk= param->table->getShare()->getPrimaryKey();
554
560
if (pk != MAX_KEY && param->table->cursor->primary_key_is_clustered())
556
562
/* The table uses clustered PK and it is not internally generated */
557
KEY_PART_INFO *key_part= param->table->key_info[pk].key_part;
558
KEY_PART_INFO *key_part_end= key_part +
563
KeyPartInfo *key_part= param->table->key_info[pk].key_part;
564
KeyPartInfo *key_part_end= key_part +
559
565
param->table->key_info[pk].key_parts;
560
566
for (;key_part != key_part_end; ++key_part)
561
567
param->needed_fields.clearBit(key_part->fieldnr-1);
1232
1247
ror_scan->sel_arg= sel_arg;
1233
1248
ror_scan->records= param->table->quick_rows[keynr];
1235
if (!(bitmap_buf= (my_bitmap_map*) alloc_root(param->mem_root,
1236
param->fields_bitmap_size)))
1250
if (!(bitmap_buf= (my_bitmap_map*) param->mem_root->alloc_root(param->fields_bitmap_size)))
1239
if (ror_scan->covered_fields.init(bitmap_buf,
1240
param->table->s->fields))
1255
if (ror_scan->covered_fields.init(bitmap_buf, param->table->getShare()->sizeFields()))
1242
1259
ror_scan->covered_fields.clearAll();
1244
KEY_PART_INFO *key_part= param->table->key_info[keynr].key_part;
1245
KEY_PART_INFO *key_part_end= key_part +
1261
KeyPartInfo *key_part= param->table->key_info[keynr].key_part;
1262
KeyPartInfo *key_part_end= key_part +
1246
1263
param->table->key_info[keynr].key_parts;
1247
1264
for (;key_part != key_part_end; ++key_part)
1349
1366
ROR_INTERSECT_INFO *info;
1350
1367
my_bitmap_map* buf;
1351
if (!(info= (ROR_INTERSECT_INFO*)alloc_root(param->mem_root,
1352
sizeof(ROR_INTERSECT_INFO))))
1368
if (!(info= (ROR_INTERSECT_INFO*)param->mem_root->alloc_root(sizeof(ROR_INTERSECT_INFO))))
1354
1370
info->param= param;
1355
if (!(buf= (my_bitmap_map*) alloc_root(param->mem_root,
1356
param->fields_bitmap_size)))
1371
if (!(buf= (my_bitmap_map*) param->mem_root->alloc_root(param->fields_bitmap_size)))
1358
if (info->covered_fields.init(buf, param->table->s->fields))
1373
if (info->covered_fields.init(buf, param->table->getShare()->sizeFields()))
1360
1375
info->is_covering= false;
1361
1376
info->index_scan_costs= 0.0;
1645
Get best covering ROR-intersection.
1647
get_best_covering_ror_intersect()
1648
param Parameter from test_quick_select function.
1649
tree optimizer::SEL_TREE with sets of intervals for different keys.
1650
read_time Don't return table read plans with cost > read_time.
1653
Best covering ROR-intersection plan
1654
NULL if no plan found.
1657
get_best_ror_intersect must be called for a tree before calling this
1659
This function invalidates tree->ror_scans member values.
1661
The following approximate algorithm is used:
1662
I=set of all covering indexes
1663
F=set of all fields to cover
1668
Order I by (#covered fields in F desc,
1670
number of first not covered component asc);
1671
F=F-covered by first(I);
1674
} while F is not empty.
1678
optimizer::RorIntersectReadPlan *get_best_covering_ror_intersect(optimizer::Parameter *param,
1679
optimizer::SEL_TREE *tree,
1682
ROR_SCAN_INFO **ror_scan_mark;
1683
ROR_SCAN_INFO **ror_scans_end= tree->ror_scans_end;
1685
for (ROR_SCAN_INFO **scan= tree->ror_scans; scan != ror_scans_end; ++scan)
1686
(*scan)->key_components=
1687
param->table->key_info[(*scan)->keynr].key_parts;
1690
Run covering-ROR-search algorithm.
1691
Assume set I is [ror_scan .. ror_scans_end)
1694
/*I=set of all covering indexes */
1695
ror_scan_mark= tree->ror_scans;
1697
MyBitmap *covered_fields= ¶m->tmp_covered_fields;
1698
if (! covered_fields->getBitmap())
1700
my_bitmap_map *tmp_bitmap= (my_bitmap_map*)param->mem_root->alloc_root(param->fields_bitmap_size);
1701
covered_fields->setBitmap(tmp_bitmap);
1703
if (! covered_fields->getBitmap() ||
1704
covered_fields->init(covered_fields->getBitmap(),
1705
param->table->getShare()->sizeFields()))
1707
covered_fields->clearAll();
1709
double total_cost= 0.0f;
1716
Update changed sorting info:
1718
number of first not covered component
1719
Calculate and save these values for each of remaining scans.
1721
for (ROR_SCAN_INFO **scan= ror_scan_mark; scan != ror_scans_end; ++scan)
1723
bitmap_subtract(&(*scan)->covered_fields, covered_fields);
1724
(*scan)->used_fields_covered=
1725
(*scan)->covered_fields.getBitsSet();
1726
(*scan)->first_uncovered_field=
1727
(*scan)->covered_fields.getFirst();
1730
internal::my_qsort(ror_scan_mark, ror_scans_end-ror_scan_mark,
1731
sizeof(ROR_SCAN_INFO*),
1732
(qsort_cmp)cmp_ror_scan_info_covering);
1735
total_cost += (*ror_scan_mark)->index_read_cost;
1736
records += (*ror_scan_mark)->records;
1737
if (total_cost > read_time)
1739
/* F=F-covered by first(I) */
1740
bitmap_union(covered_fields, &(*ror_scan_mark)->covered_fields);
1741
all_covered= bitmap_is_subset(¶m->needed_fields, covered_fields);
1742
} while ((++ror_scan_mark < ror_scans_end) && !all_covered);
1744
if (!all_covered || (ror_scan_mark - tree->ror_scans) == 1)
1748
Ok, [tree->ror_scans .. ror_scan) holds covering index_intersection with
1751
/* Add priority queue use cost. */
1752
total_cost += rows2double(records)*
1753
log((double)(ror_scan_mark - tree->ror_scans)) /
1754
(TIME_FOR_COMPARE_ROWID * M_LN2);
1756
if (total_cost > read_time)
1759
optimizer::RorIntersectReadPlan *trp= NULL;
1760
if (! (trp= new (param->mem_root) optimizer::RorIntersectReadPlan))
1765
uint32_t best_num= (ror_scan_mark - tree->ror_scans);
1766
if (!(trp->first_scan= (ROR_SCAN_INFO**)param->mem_root->alloc_root(sizeof(ROR_SCAN_INFO*)* best_num)))
1768
memcpy(trp->first_scan, tree->ror_scans, best_num*sizeof(ROR_SCAN_INFO*));
1769
trp->last_scan= trp->first_scan + best_num;
1770
trp->is_covering= true;
1771
trp->read_cost= total_cost;
1772
trp->records= records;
1773
trp->cpk_scan= NULL;
1774
set_if_smaller(param->table->quick_condition_rows, records);
1630
1781
Get best ROR-intersection plan using non-covering ROR-intersection search
1631
1782
algorithm. The returned plan may be covering.
1813
1962
if (! (trp= new (param->mem_root) optimizer::RorIntersectReadPlan))
1816
trp->ror_range_scans.assign(intersect_scans, intersect_scans + best_num);
1817
trp->setRowRetrievalNecessary(intersect_best->is_covering);
1965
if (! (trp->first_scan=
1966
(ROR_SCAN_INFO**)param->mem_root->alloc_root(sizeof(ROR_SCAN_INFO*)*best_num)))
1968
memcpy(trp->first_scan, intersect_scans, best_num*sizeof(ROR_SCAN_INFO*));
1969
trp->last_scan= trp->first_scan + best_num;
1970
trp->is_covering= intersect_best->is_covering;
1818
1971
trp->read_cost= intersect_best->total_cost;
1819
1972
/* Prevent divisons by zero */
1820
1973
ha_rows best_rows = double2rows(intersect_best->out_rows);
1833
Get best covering ROR-intersection.
1835
get_best_covering_ror_intersect()
1836
param Parameter from test_quick_select function.
1837
tree optimizer::SEL_TREE with sets of intervals for different keys.
1838
read_time Don't return table read plans with cost > read_time.
1841
Best covering ROR-intersection plan
1842
NULL if no plan found.
1845
get_best_ror_intersect must be called for a tree before calling this
1847
This function invalidates tree->ror_scans member values.
1849
The following approximate algorithm is used:
1850
I=set of all covering indexes
1851
F=set of all fields to cover
1856
Order I by (#covered fields in F desc,
1858
number of first not covered component asc);
1859
F=F-covered by first(I);
1862
} while F is not empty.
1866
optimizer::RorIntersectReadPlan *get_best_covering_ror_intersect(optimizer::Parameter *param,
1867
optimizer::SEL_TREE *tree,
1870
ROR_SCAN_INFO **ror_scan_mark;
1871
ROR_SCAN_INFO **ror_scans_end= tree->ror_scans_end;
1873
for (ROR_SCAN_INFO **scan= tree->ror_scans; scan != ror_scans_end; ++scan)
1874
(*scan)->key_components=
1875
param->table->key_info[(*scan)->keynr].key_parts;
1878
Run covering-ROR-search algorithm.
1879
Assume set I is [ror_scan .. ror_scans_end)
1882
/*I=set of all covering indexes */
1883
ror_scan_mark= tree->ror_scans;
1885
MyBitmap *covered_fields= ¶m->tmp_covered_fields;
1886
if (! covered_fields->getBitmap())
1888
my_bitmap_map *tmp_bitmap= (my_bitmap_map*)alloc_root(param->mem_root,
1889
param->fields_bitmap_size);
1890
covered_fields->setBitmap(tmp_bitmap);
1892
if (! covered_fields->getBitmap() ||
1893
covered_fields->init(covered_fields->getBitmap(),
1894
param->table->s->fields))
1896
covered_fields->clearAll();
1898
double total_cost= 0.0f;
1905
Update changed sorting info:
1907
number of first not covered component
1908
Calculate and save these values for each of remaining scans.
1910
for (ROR_SCAN_INFO **scan= ror_scan_mark; scan != ror_scans_end; ++scan)
1912
bitmap_subtract(&(*scan)->covered_fields, covered_fields);
1913
(*scan)->used_fields_covered=
1914
(*scan)->covered_fields.getBitsSet();
1915
(*scan)->first_uncovered_field=
1916
(*scan)->covered_fields.getFirst();
1919
internal::my_qsort(ror_scan_mark, ror_scans_end-ror_scan_mark,
1920
sizeof(ROR_SCAN_INFO*),
1921
(qsort_cmp)cmp_ror_scan_info_covering);
1924
total_cost += (*ror_scan_mark)->index_read_cost;
1925
records += (*ror_scan_mark)->records;
1926
if (total_cost > read_time)
1928
/* F=F-covered by first(I) */
1929
bitmap_union(covered_fields, &(*ror_scan_mark)->covered_fields);
1930
all_covered= bitmap_is_subset(¶m->needed_fields, covered_fields);
1931
} while ((++ror_scan_mark < ror_scans_end) && !all_covered);
1933
if (!all_covered || (ror_scan_mark - tree->ror_scans) == 1)
1937
Ok, [tree->ror_scans .. ror_scan) holds covering index_intersection with
1940
/* Add priority queue use cost. */
1941
total_cost += rows2double(records)*
1942
log((double)(ror_scan_mark - tree->ror_scans)) /
1943
(TIME_FOR_COMPARE_ROWID * M_LN2);
1945
if (total_cost > read_time)
1948
optimizer::RorIntersectReadPlan *trp= NULL;
1949
if (! (trp= new (param->mem_root) optimizer::RorIntersectReadPlan))
1954
uint32_t best_num= (ror_scan_mark - tree->ror_scans);
1955
trp->ror_range_scans.assign(tree->ror_scans, tree->ror_scans + best_num);
1956
trp->setRowRetrievalNecessary(true);
1957
trp->read_cost= total_cost;
1958
trp->records= records;
1959
trp->cpk_scan= NULL;
1960
set_if_smaller(param->table->quick_condition_rows, records);
1967
1986
Get best "range" table read plan for given optimizer::SEL_TREE, also update some info
1970
1989
get_key_scans_params()
1971
1991
param Parameters from test_quick_select
1972
1992
tree Make range select for this optimizer::SEL_TREE
1973
1993
index_read_must_be_used true <=> assume 'index only' option will be set
3949
3985
static bool is_key_scan_ror(optimizer::Parameter *param, uint32_t keynr, uint8_t nparts)
3951
KEY *table_key= param->table->key_info + keynr;
3952
KEY_PART_INFO *key_part= table_key->key_part + nparts;
3953
KEY_PART_INFO *key_part_end= (table_key->key_part +
3987
KeyInfo *table_key= param->table->key_info + keynr;
3988
KeyPartInfo *key_part= table_key->key_part + nparts;
3989
KeyPartInfo *key_part_end= (table_key->key_part +
3954
3990
table_key->key_parts);
3955
3991
uint32_t pk_number;
3957
for (KEY_PART_INFO *kp= table_key->key_part; kp < key_part; kp++)
3993
for (KeyPartInfo *kp= table_key->key_part; kp < key_part; kp++)
3959
3995
uint16_t fieldnr= param->table->key_info[keynr].
3960
3996
key_part[kp - table_key->key_part].fieldnr - 1;
3961
if (param->table->field[fieldnr]->key_length() != kp->length)
3997
if (param->table->getField(fieldnr)->key_length() != kp->length)
4417
static inline uint32_t get_field_keypart(KEY *index, Field *field);
4458
static inline uint32_t get_field_keypart(KeyInfo *index, Field *field);
4419
4460
static inline optimizer::SEL_ARG * get_index_range_tree(uint32_t index,
4420
4461
optimizer::SEL_TREE *range_tree,
4421
4462
optimizer::Parameter *param,
4422
4463
uint32_t *param_idx);
4424
static bool get_constant_key_infix(KEY *index_info,
4465
static bool get_constant_key_infix(KeyInfo *index_info,
4425
4466
optimizer::SEL_ARG *index_range_tree,
4426
KEY_PART_INFO *first_non_group_part,
4427
KEY_PART_INFO *min_max_arg_part,
4428
KEY_PART_INFO *last_part,
4467
KeyPartInfo *first_non_group_part,
4468
KeyPartInfo *min_max_arg_part,
4469
KeyPartInfo *last_part,
4429
4470
Session *session,
4430
4471
unsigned char *key_infix,
4431
4472
uint32_t *key_infix_len,
4432
KEY_PART_INFO **first_non_infix_part);
4473
KeyPartInfo **first_non_infix_part);
4434
4475
static bool check_group_min_max_predicates(COND *cond, Item_field *min_max_arg_item);
4437
4478
cost_group_min_max(Table* table,
4479
KeyInfo *index_info,
4439
4480
uint32_t used_key_parts,
4440
4481
uint32_t group_key_parts,
4441
4482
optimizer::SEL_TREE *range_tree,
4578
4619
get_best_group_min_max(optimizer::Parameter *param, optimizer::SEL_TREE *tree)
4580
4621
Session *session= param->session;
4581
JOIN *join= session->lex->current_select->join;
4622
Join *join= session->lex->current_select->join;
4582
4623
Table *table= param->table;
4583
4624
bool have_min= false; /* true if there is a MIN function. */
4584
4625
bool have_max= false; /* true if there is a MAX function. */
4585
4626
Item_field *min_max_arg_item= NULL; // The argument of all MIN/MAX functions
4586
KEY_PART_INFO *min_max_arg_part= NULL; /* The corresponding keypart. */
4627
KeyPartInfo *min_max_arg_part= NULL; /* The corresponding keypart. */
4587
4628
uint32_t group_prefix_len= 0; /* Length (in bytes) of the key prefix. */
4588
KEY *index_info= NULL; /* The index chosen for data access. */
4629
KeyInfo *index_info= NULL; /* The index chosen for data access. */
4589
4630
uint32_t index= 0; /* The id of the chosen index. */
4590
4631
uint32_t group_key_parts= 0; // Number of index key parts in the group prefix.
4591
4632
uint32_t used_key_parts= 0; /* Number of index key parts used for access. */
4665
4706
(GA1,GA2) are all true. If there is more than one such index, select the
4666
4707
first one. Here we set the variables: group_prefix_len and index_info.
4668
KEY *cur_index_info= table->key_info;
4669
KEY *cur_index_info_end= cur_index_info + table->s->keys;
4670
KEY_PART_INFO *cur_part= NULL;
4671
KEY_PART_INFO *end_part= NULL; /* Last part for loops. */
4709
KeyInfo *cur_index_info= table->key_info;
4710
KeyInfo *cur_index_info_end= cur_index_info + table->getShare()->sizeKeys();
4711
KeyPartInfo *cur_part= NULL;
4712
KeyPartInfo *end_part= NULL; /* Last part for loops. */
4672
4713
/* Last index part. */
4673
KEY_PART_INFO *last_part= NULL;
4674
KEY_PART_INFO *first_non_group_part= NULL;
4675
KEY_PART_INFO *first_non_infix_part= NULL;
4714
KeyPartInfo *last_part= NULL;
4715
KeyPartInfo *first_non_group_part= NULL;
4716
KeyPartInfo *first_non_infix_part= NULL;
4676
4717
uint32_t key_infix_parts= 0;
4677
4718
uint32_t cur_group_key_parts= 0;
4678
4719
uint32_t cur_group_prefix_len= 0;
5179
get_constant_key_infix(KEY *,
5221
get_constant_key_infix(KeyInfo *,
5180
5222
optimizer::SEL_ARG *index_range_tree,
5181
KEY_PART_INFO *first_non_group_part,
5182
KEY_PART_INFO *min_max_arg_part,
5183
KEY_PART_INFO *last_part,
5223
KeyPartInfo *first_non_group_part,
5224
KeyPartInfo *min_max_arg_part,
5225
KeyPartInfo *last_part,
5185
5227
unsigned char *key_infix,
5186
5228
uint32_t *key_infix_len,
5187
KEY_PART_INFO **first_non_infix_part)
5229
KeyPartInfo **first_non_infix_part)
5189
5231
optimizer::SEL_ARG *cur_range= NULL;
5190
KEY_PART_INFO *cur_part= NULL;
5232
KeyPartInfo *cur_part= NULL;
5191
5233
/* End part for the first loop below. */
5192
KEY_PART_INFO *end_part= min_max_arg_part ? min_max_arg_part : last_part;
5234
KeyPartInfo *end_part= min_max_arg_part ? min_max_arg_part : last_part;
5194
5236
*key_infix_len= 0;
5195
5237
unsigned char *key_ptr= key_infix;