MySQL 8.1.0
Source Code Documentation
index_range_scan_plan.h
Go to the documentation of this file.
1/* Copyright (c) 2000, 2023, 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 ror_only true <=> consider only ROR scans.
66 needed_reg ptr to needed_reg argument
67 of test_quick_select().
68
69 DESCRIPTION
70 Find the best "range" table read plan for given SEL_TREE.
71 The side effects are
72 - tree->ror_scans is updated to indicate which scans are ROR scans.
73 - if update_tbl_stats=true then table->quick_* is updated with info
74 about every possible range scan.
75
76 RETURN
77 Best range read plan
78 NULL if no plan found or error occurred
79*/
80
82 SEL_TREE *tree, bool index_read_must_be_used,
83 bool update_tbl_stats,
84 enum_order interesting_order,
85 bool skip_records_in_range, double cost_est,
86 bool ror_only, Key_map *needed_reg);
87
88/*
89 Calculate estimate of number records that will be retrieved by a range
90 scan on given index using given SEL_ARG intervals tree.
91
92 SYNOPSIS
93 check_quick_select()
94 param Parameter from test_quick_select
95 idx Number of index to use in RANGE_OPT_PARAM::key
96 SEL_TREE::key
97 index_only true - assume only index tuples will be accessed
98 false - assume full table rows will be read
99 tree Transformed selection condition, tree->key[idx] holds
100 the intervals for the given index.
101 update_tbl_stats true <=> update table->quick_* with information
102 about range scan we've evaluated.
103 order_direction The sort order the range access method must be able
104 to provide. Three-value logic: asc/desc/don't care
105 skip_records_in_range Same value as JOIN_TAB::skip_records_in_range().
106 mrr_flags INOUT MRR access flags
107 cost OUT Scan cost
108 is_ror_scan OUT Set to reflect if the key scan is a ROR
109 (see is_key_scan_ror function for more info)
110 is_imerge_scan OUT Set to reflect if the key scan can be used for
111 index-merge-scan
112
113 NOTES
114 param->table->quick_*, param->range_count (and maybe others) are
115 updated with data of given key scan, see quick_range_seq_next for details.
116
117 RETURN
118 Estimate # of records to be retrieved.
119 HA_POS_ERROR if estimate calculation failed due to table handler problems.
120*/
121ha_rows check_quick_select(THD *thd, RANGE_OPT_PARAM *param, uint idx,
122 bool index_only, SEL_ROOT *tree,
123 bool update_tbl_stats, enum_order order_direction,
124 bool skip_records_in_range, uint *mrr_flags,
125 uint *bufsize, Cost_estimate *cost,
126 bool *is_ror_scan, bool *is_imerge_scan);
127
128#ifndef NDEBUG
129void dbug_dump_range(int indent, bool verbose, TABLE *table, int index,
130 KEY_PART *used_key_part,
132#endif
133
135 const RANGE_OPT_PARAM *param,
136 Opt_trace_object *trace_object);
137
138#endif // SQL_RANGE_OPTIMIZER_INDEX_RANGE_SCAN_PLAN_H_
Definition: sql_bitmap.h:144
A wrapper class which provides array bounds checking.
Definition: sql_array.h:46
Used to store optimizer cost estimates.
Definition: handler.h:3752
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
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
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, bool ror_only, Key_map *needed_reg)
Definition: index_range_scan_plan.cc:819
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:1311
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:65
static char * path
Definition: mysqldump.cc:140
static PFS_engine_table_share_proxy table
Definition: pfs.cc:60
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:193
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:1394