MySQL 9.1.0
Source Code Documentation
index_skip_scan_plan.h
Go to the documentation of this file.
1/* Copyright (c) 2000, 2024, 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 designed to work 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 either included with
13 the program or referenced in the documentation.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License, version 2.0, for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
23
24#ifndef SQL_RANGE_OPTIMIZER_INDEX_SKIP_SCAN_PLAN_H_
25#define SQL_RANGE_OPTIMIZER_INDEX_SKIP_SCAN_PLAN_H_
26
27#include <sys/types.h>
28
29#include "my_base.h"
31
32class KEY;
33class KEY_PART_INFO;
35class RANGE_OPT_PARAM;
36class SEL_ARG;
37class SEL_ROOT;
38class SEL_TREE;
39struct MEM_ROOT;
40
41/*
42 This is an array of array of equality constants with length
43 eq_prefix_key_parts.
44
45 For example, an equality predicate like "a IN (1, 2) AND b IN (2, 3, 4)",
46 eq_prefixes will contain:
47
48 [
49 { eq_key_prefixes = array[1, 2], cur_eq_prefix = ... },
50 { eq_key_prefixes = array[2, 3, 4], cur_eq_prefix = ... }
51 ]
52 */
53struct EQPrefix {
55
56 /*
57 During skip scan, we will have to iterate through all possible
58 equality prefixes. This is the product of all the elements in
59 eq_prefix_elements. In the above example, there are 2 x 3 = 6 possible
60 equality prefixes.
61
62 To track which prefix we are on, we use cur_eq_prefix. For example,
63 if both EQPrefixes have the value 1 here, it indicates that the current
64 equality prefix is (2, 3).
65 */
66 unsigned cur_eq_prefix;
67};
68
69/**
70 Logically a part of AccessPath::index_skip_scan(), but is too large,
71 so split out into its own struct.
72 */
74 KEY *index_info; ///< The index chosen for data access
75 uint eq_prefix_len; ///< Length of the equality prefix
76 uint eq_prefix_key_parts; ///< Number of key parts in the equality prefix
77 EQPrefix *eq_prefixes; ///< Array of equality constants (IN list)
78 KEY_PART_INFO *range_key_part; ///< The key part matching the range condition
79 uint used_key_parts; ///< Number of index keys used for skip scan
80 double read_cost; ///< Total cost of read
81 uint index; ///< Position of chosen index
82
90
91 // The sub-tree corresponding to the range condition
92 // (on key part C - for more details see description of get_best_skip_scan()).
93 //
94 // Does not necessarily live as long as the AccessPath, so used for tracing
95 // only.
97
98 SEL_ROOT *index_range_tree; ///< The sub-tree corresponding to index_info
99 bool has_aggregate_function; ///< TRUE if there are aggregate functions.
100};
101
103 RANGE_OPT_PARAM *param,
104 SEL_TREE *tree,
105 enum_order order_direction,
106 bool skip_records_in_range,
107 bool force_skip_scan);
109 enum_order order_direction,
110 bool skip_records_in_range,
111 bool force_skip_scan);
112
114 const RANGE_OPT_PARAM *param,
115 Opt_trace_object *trace_object);
116
117#ifndef NDEBUG
118void dbug_dump_index_skip_scan(int indent, bool verbose,
119 const AccessPath *path);
120#endif
121
122#endif // SQL_RANGE_OPTIMIZER_INDEX_SKIP_SCAN_PLAN_H_
A wrapper class which provides array bounds checking.
Definition: sql_array.h:47
Definition: key.h:57
Definition: key.h:113
A typesafe replacement for DYNAMIC_ARRAY.
Definition: mem_root_array.h:426
A JSON object (unordered set of key/value pairs).
Definition: opt_trace.h:802
Definition: range_opt_param.h:29
Definition: tree.h:465
A graph of (possible multiple) key ranges, represented as a red-black binary tree.
Definition: tree.h:68
Definition: tree.h:871
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
void trace_basic_info_index_skip_scan(THD *thd, const AccessPath *path, const RANGE_OPT_PARAM *param, Opt_trace_object *trace_object)
Definition: index_skip_scan_plan.cc:71
void dbug_dump_index_skip_scan(int indent, bool verbose, const AccessPath *path)
Definition: index_skip_scan_plan.cc:804
Mem_root_array< AccessPath * > get_all_skip_scans(THD *thd, RANGE_OPT_PARAM *param, SEL_TREE *tree, enum_order order_direction, bool skip_records_in_range, bool force_skip_scan)
Test if skip scan is applicable and if so, construct a new AccessPath for each candidate index skip s...
Definition: index_skip_scan_plan.cc:142
AccessPath * get_best_skip_scan(THD *thd, RANGE_OPT_PARAM *param, SEL_TREE *tree, enum_order order_direction, bool skip_records_in_range, bool force_skip_scan)
Test if skip scan is applicable and if so, construct a new AccessPath.
Definition: index_skip_scan_plan.cc:211
enum_order
Definition: key_spec.h:65
This file includes constants used by all storage engines.
unsigned char uchar
Definition: my_inttypes.h:52
static uint verbose
Definition: mysqlcheck.cc:66
static char * path
Definition: mysqldump.cc:149
Access paths are a query planning structure that correspond 1:1 to iterators, in that an access path ...
Definition: access_path.h:227
Definition: index_skip_scan_plan.h:53
Bounds_checked_array< uchar * > eq_key_prefixes
Definition: index_skip_scan_plan.h:54
unsigned cur_eq_prefix
Definition: index_skip_scan_plan.h:66
Logically a part of AccessPath::index_skip_scan(), but is too large, so split out into its own struct...
Definition: index_skip_scan_plan.h:73
double read_cost
Total cost of read.
Definition: index_skip_scan_plan.h:80
uint eq_prefix_len
Length of the equality prefix.
Definition: index_skip_scan_plan.h:75
uchar * min_range_key
Definition: index_skip_scan_plan.h:83
uint range_cond_flag
Definition: index_skip_scan_plan.h:87
KEY * index_info
The index chosen for data access.
Definition: index_skip_scan_plan.h:74
bool has_aggregate_function
TRUE if there are aggregate functions.
Definition: index_skip_scan_plan.h:99
uint num_output_rows
Definition: index_skip_scan_plan.h:89
uint range_key_len
Definition: index_skip_scan_plan.h:88
uchar * max_search_key
Definition: index_skip_scan_plan.h:86
uchar * max_range_key
Definition: index_skip_scan_plan.h:84
SEL_ROOT * index_range_tree
The sub-tree corresponding to index_info.
Definition: index_skip_scan_plan.h:98
uint used_key_parts
Number of index keys used for skip scan.
Definition: index_skip_scan_plan.h:79
uint eq_prefix_key_parts
Number of key parts in the equality prefix.
Definition: index_skip_scan_plan.h:76
uchar * min_search_key
Definition: index_skip_scan_plan.h:85
KEY_PART_INFO * range_key_part
The key part matching the range condition.
Definition: index_skip_scan_plan.h:78
EQPrefix * eq_prefixes
Array of equality constants (IN list)
Definition: index_skip_scan_plan.h:77
const SEL_ARG * range_part_tracing_only
Definition: index_skip_scan_plan.h:96
uint index
Position of chosen index.
Definition: index_skip_scan_plan.h:81
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:83