MySQL 8.0.32
Source Code Documentation
index_range_scan_plan.h
Go to the documentation of this file.
1/* Copyright (c) 2000, 2022, Oracle and/or its affiliates.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is also distributed with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have included with MySQL.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License, version 2.0, for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
22
23#ifndef SQL_RANGE_OPTIMIZER_INDEX_RANGE_SCAN_PLAN_H_
24#define SQL_RANGE_OPTIMIZER_INDEX_RANGE_SCAN_PLAN_H_
25
26#include <sys/types.h>
27
28#include "my_dbug.h"
29#include "sql/handler.h"
35#include "sql/sql_const.h"
36
38class RANGE_OPT_PARAM;
39class SEL_ROOT;
40class SEL_TREE;
41struct MEM_ROOT;
42
43bool get_ranges_from_tree(MEM_ROOT *return_mem_root, TABLE *table,
44 KEY_PART *key, uint keyno, SEL_ROOT *key_tree,
45 uint num_key_parts, unsigned *used_key_parts,
46 unsigned *num_exact_key_parts, Quick_ranges *ranges);
47
48/*
49 Get best "range" table read plan for given SEL_TREE, also update some info
50
51 SYNOPSIS
52 get_key_scans_params()
53 param Parameters from test_quick_select
54 tree Make range select for this SEL_TREE
55 index_read_must_be_used true <=> assume 'index only' option will be set
56 (except for clustered PK indexes)
57 update_tbl_stats true <=> update table->quick_* with information
58 about range scans we've evaluated.
59 interesting_order The sort order the range access method must be
60 able to provide. Three-value logic:
61 asc/desc/don't care
62 skip_records_in_range Same value as JOIN_TAB::skip_records_in_range().
63 cost_est Maximum cost. i.e. don't create read plans with
64 cost > cost_est.
65 needed_reg ptr to needed_reg argument
66 of test_quick_select().
67
68 DESCRIPTION
69 Find the best "range" table read plan for given SEL_TREE.
70 The side effects are
71 - tree->ror_scans is updated to indicate which scans are ROR scans.
72 - if update_tbl_stats=true then table->quick_* is updated with info
73 about every possible range scan.
74
75 RETURN
76 Best range read plan
77 NULL if no plan found or error occurred
78*/
79
81 SEL_TREE *tree, bool index_read_must_be_used,
82 bool update_tbl_stats,
83 enum_order interesting_order,
84 bool skip_records_in_range, double cost_est,
85 Key_map *needed_reg);
86
87/*
88 Calculate estimate of number records that will be retrieved by a range
89 scan on given index using given SEL_ARG intervals tree.
90
91 SYNOPSIS
92 check_quick_select()
93 param Parameter from test_quick_select
94 idx Number of index to use in RANGE_OPT_PARAM::key
95 SEL_TREE::key
96 index_only true - assume only index tuples will be accessed
97 false - assume full table rows will be read
98 tree Transformed selection condition, tree->key[idx] holds
99 the intervals for the given index.
100 update_tbl_stats true <=> update table->quick_* with information
101 about range scan we've evaluated.
102 order_direction The sort order the range access method must be able
103 to provide. Three-value logic: asc/desc/don't care
104 skip_records_in_range Same value as JOIN_TAB::skip_records_in_range().
105 mrr_flags INOUT MRR access flags
106 cost OUT Scan cost
107 is_ror_scan OUT Set to reflect if the key scan is a ROR
108 (see is_key_scan_ror function for more info)
109 is_imerge_scan OUT Set to reflect if the key scan can be used for
110 index-merge-scan
111
112 NOTES
113 param->table->quick_*, param->range_count (and maybe others) are
114 updated with data of given key scan, see quick_range_seq_next for details.
115
116 RETURN
117 Estimate # of records to be retrieved.
118 HA_POS_ERROR if estimate calculation failed due to table handler problems.
119*/
121 bool index_only, SEL_ROOT *tree,
122 bool update_tbl_stats, enum_order order_direction,
123 bool skip_records_in_range, uint *mrr_flags,
124 uint *bufsize, Cost_estimate *cost,
125 bool *is_ror_scan, bool *is_imerge_scan);
126
127#ifndef NDEBUG
128void dbug_dump_range(int indent, bool verbose, TABLE *table, int index,
129 KEY_PART *used_key_part,
131#endif
132
134 const RANGE_OPT_PARAM *param,
135 Opt_trace_object *trace_object);
136
137#endif // SQL_RANGE_OPTIMIZER_INDEX_RANGE_SCAN_PLAN_H_
Definition: sql_bitmap.h:137
A wrapper class which provides array bounds checking.
Definition: sql_array.h:46
Used to store optimizer cost estimates.
Definition: handler.h:3646
A JSON object (unordered set of key/value pairs).
Definition: opt_trace.h:798
Definition: range_opt_param.h:28
A graph of (possible multiple) key ranges, represented as a red-black binary tree.
Definition: tree.h:67
Definition: tree.h:870
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:33
AccessPath * get_key_scans_params(THD *thd, RANGE_OPT_PARAM *param, SEL_TREE *tree, bool index_read_must_be_used, bool update_tbl_stats, enum_order interesting_order, bool skip_records_in_range, double cost_est, Key_map *needed_reg)
Definition: index_range_scan_plan.cc:819
ha_rows check_quick_select(THD *thd, RANGE_OPT_PARAM *param, uint idx, bool index_only, SEL_ROOT *tree, bool update_tbl_stats, enum_order order_direction, bool skip_records_in_range, uint *mrr_flags, uint *bufsize, Cost_estimate *cost, bool *is_ror_scan, bool *is_imerge_scan)
Definition: index_range_scan_plan.cc:567
void trace_basic_info_index_range_scan(THD *thd, const AccessPath *path, const RANGE_OPT_PARAM *param, Opt_trace_object *trace_object)
Definition: index_range_scan_plan.cc:793
void dbug_dump_range(int indent, bool verbose, TABLE *table, int index, KEY_PART *used_key_part, Bounds_checked_array< QUICK_RANGE * > ranges)
Definition: index_range_scan_plan.cc:1307
bool get_ranges_from_tree(MEM_ROOT *return_mem_root, TABLE *table, KEY_PART *key, uint keyno, SEL_ROOT *key_tree, uint num_key_parts, unsigned *used_key_parts, unsigned *num_exact_key_parts, Quick_ranges *ranges)
Definition: index_range_scan_plan.cc:771
enum_order
Definition: key_spec.h:64
my_off_t ha_rows
Definition: my_base.h:1139
static uint verbose
Definition: mysqlcheck.cc:64
static char * path
Definition: mysqldump.cc:133
required string key
Definition: replication_asynchronous_connection_failover.proto:59
File containing constants that can be used throughout the server.
Access paths are a query planning structure that correspond 1:1 to iterators, in that an access path ...
Definition: access_path.h:189
Definition: range_optimizer.h:54
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:82
Definition: table.h:1395
unsigned int uint
Definition: uca-dump.cc:29