MySQL 8.0.39
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 corresponding to the range
79 ///< condition
86
87 // The sub-tree corresponding to the range condition
88 // (on key part C - for more details see description of get_best_skip_scan()).
89 //
90 // Does not necessarily live as long as the AccessPath, so used for tracing
91 // only.
93
94 SEL_ROOT *index_range_tree; ///< The sub-tree corresponding to index_info
95 bool has_aggregate_function; ///< TRUE if there are aggregate functions.
96};
97
99 enum_order order_direction,
100 bool skip_records_in_range,
101 bool force_skip_scan);
102
104 const RANGE_OPT_PARAM *param,
105 Opt_trace_object *trace_object);
106
107#ifndef NDEBUG
108void dbug_dump_index_skip_scan(int indent, bool verbose,
109 const AccessPath *path);
110#endif
111
112#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 JSON object (unordered set of key/value pairs).
Definition: opt_trace.h:799
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:34
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:70
void dbug_dump_index_skip_scan(int indent, bool verbose, const AccessPath *path)
Definition: index_skip_scan_plan.cc:657
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:166
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:65
static char * path
Definition: mysqldump.cc:137
Access paths are a query planning structure that correspond 1:1 to iterators, in that an access path ...
Definition: access_path.h:193
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
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:80
uint range_cond_flag
Definition: index_skip_scan_plan.h:84
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:95
uint range_key_len
Definition: index_skip_scan_plan.h:85
uchar * max_search_key
Definition: index_skip_scan_plan.h:83
uchar * max_range_key
Definition: index_skip_scan_plan.h:81
SEL_ROOT * index_range_tree
The sub-tree corresponding to index_info.
Definition: index_skip_scan_plan.h:94
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:82
KEY_PART_INFO * range_key_part
The key part corresponding to 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:92
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:83
unsigned int uint
Definition: uca9-dump.cc:75