MySQL 8.4.0
Source Code Documentation
IndexSkipScanIterator Class Reference

#include <index_skip_scan.h>

Inheritance diagram for IndexSkipScanIterator:

Public Member Functions

 IndexSkipScanIterator (THD *thd, TABLE *table, KEY *index_info, uint index, uint eq_prefix_len, uint eq_prefix_key_parts, EQPrefix *eq_prefixes, uint used_key_parts, MEM_ROOT *temp_mem_root, bool has_aggregate_function, uchar *min_range_key, uchar *max_range_key, uchar *min_search_key, uchar *max_search_key, uint range_cond_flag, uint range_key_len)
 Construct new quick select for queries that can do skip scans. More...
 ~IndexSkipScanIterator () override
bool Init () override
 Initialize or reinitialize the iterator. More...
int Read () override
 Get the next row for skip scan. More...
- Public Member Functions inherited from TableRowIterator
 TableRowIterator (THD *thd, TABLE *table)
void UnlockRow () override
 The default implementation of unlock-row method of RowIterator, used in all access methods except EQRefIterator. More...
void SetNullRowFlag (bool is_null_row) override
 Mark the current row buffer as containing a NULL row or not, so that if you read from it and the flag is true, you'll get only NULLs no matter what is actually in the buffer (typically some old leftover row). More...
void StartPSIBatchMode () override
 Start performance schema batch mode, if supported (otherwise ignored). More...
void EndPSIBatchModeIfStarted () override
 Ends performance schema batch mode, if started. More...
- Public Member Functions inherited from RowIterator
 RowIterator (THD *thd)
virtual ~RowIterator ()=default
 RowIterator (const RowIterator &)=delete
 RowIterator (RowIterator &&)=default
virtual const IteratorProfilerGetProfiler () const
 Get profiling data for this iterator (for 'EXPLAIN ANALYZE'). More...
virtual void SetOverrideProfiler ([[maybe_unused]] const IteratorProfiler *profiler)
virtual RowIteratorreal_iterator ()
 If this iterator is wrapping a different iterator (e.g. More...
virtual const RowIteratorreal_iterator () const

Private Member Functions

bool next_eq_prefix ()
 Increments cur_prefix and sets what the next equality prefix should be. More...

Private Attributes

uint index
MY_BITMAP column_bitmap
const uint eq_prefix_len
uint eq_prefix_key_parts
uint max_used_key_length
uint used_key_parts
uint distinct_prefix_len
uint distinct_prefix_key_parts
const uint range_key_len
bool seen_first_key
uchar *const min_range_key
uchar *const max_range_key
uchar *const min_search_key
uchar *const max_search_key
const uint range_cond_flag
key_range start_key
key_range end_key
bool has_aggregate_function

Additional Inherited Members

- Protected Member Functions inherited from TableRowIterator
int HandleError (int error)
void PrintError (int error)
TABLEtable () const
- Protected Member Functions inherited from RowIterator
THDthd () const

Constructor & Destructor Documentation

◆ IndexSkipScanIterator()

IndexSkipScanIterator::IndexSkipScanIterator ( THD thd,
TABLE table_arg,
KEY index_info,
uint  use_index,
uint  eq_prefix_len,
uint  eq_prefix_key_parts,
EQPrefix eq_prefixes,
uint  used_key_parts_arg,
MEM_ROOT return_mem_root,
bool  has_aggregate_function,
uchar min_range_key_arg,
uchar max_range_key_arg,
uchar min_search_key_arg,
uchar max_search_key_arg,
uint  range_cond_flag_arg,
uint  range_key_len_arg 

Construct new quick select for queries that can do skip scans.

See get_best_skip_scan() description for more details.

SYNOPSIS IndexSkipScanIterator::IndexSkipScanIterator() table The table being accessed index_info The index chosen for data access use_index The id of index_info range_part The keypart belonging to the range condition C index_range_tree The complete range key eq_prefix_len Length of the equality prefix key eq_prefix_key_parts Number of keyparts in the equality prefix eq_prefixes Array of equality constants (IN list) used_key_parts_arg Total number of keyparts A_1,...,C read_cost_arg Cost of this access method read_records Number of records returned return_mem_root Memory pool for this class


◆ ~IndexSkipScanIterator()

IndexSkipScanIterator::~IndexSkipScanIterator ( )

Member Function Documentation

◆ Init()

bool IndexSkipScanIterator::Init ( )

Initialize or reinitialize the iterator.

You must always call Init() before trying a Read() (but Init() does not imply Read()).

You can call Init() multiple times; subsequent calls will rewind the iterator (or reposition it, depending on whether the iterator takes in e.g. a Index_lookup) and allow you to read the records anew.

Implements RowIterator.

◆ next_eq_prefix()

bool IndexSkipScanIterator::next_eq_prefix ( )

Increments cur_prefix and sets what the next equality prefix should be.

SYNOPSIS IndexSkipScanIterator::next_eq_prefix()

DESCRIPTION Increments cur_prefix and sets what the next equality prefix should be. This is done in index order, so the increment happens on the last keypart. The key is written to eq_prefix.

RETURN true OK false No more equality key prefixes.

◆ Read()

int IndexSkipScanIterator::Read ( )

Get the next row for skip scan.

SYNOPSIS IndexSkipScanIterator::Read()

DESCRIPTION Find the next record in the skip scan. The scan is broken into groups based on distinct A_1,...,B_m. The strategy is to have an outer loop going through all possible A_1,...,A_k. This work is done in next_eq_prefix().

For each equality prefix that we get from "next_eq_prefix() we loop through all distinct B_1,...,B_m within that prefix. And for each of those groups we do a subrange scan on keypart C.

The high level algorithm is like so: for (eq_prefix in eq_prefixes) // (A_1,....A_k) for (distinct_prefix in eq_prefix) // A_1-B_1,...,A_k-B_m do subrange scan within distinct prefix using range_cond // A_1-B_1-C,...A_k-B_m-C

But since this is a iterator interface, state needs to be kept between calls. State is stored in eq_prefix, cur_eq_prefix and distinct_prefix.

NOTES We can be more memory efficient by combining some of these fields. For example, eq_prefix will always be a prefix of distinct_prefix, and distinct_prefix will always be a prefix of min_search_key/max_search_key.

RETURN See RowIterator::Read()

Implements RowIterator.

Member Data Documentation

◆ column_bitmap

MY_BITMAP IndexSkipScanIterator::column_bitmap

◆ distinct_prefix

uchar* IndexSkipScanIterator::distinct_prefix

◆ distinct_prefix_key_parts

uint IndexSkipScanIterator::distinct_prefix_key_parts

◆ distinct_prefix_len

uint IndexSkipScanIterator::distinct_prefix_len

◆ end_key

key_range IndexSkipScanIterator::end_key

◆ eq_prefix

uchar* IndexSkipScanIterator::eq_prefix

◆ eq_prefix_key_parts

uint IndexSkipScanIterator::eq_prefix_key_parts

◆ eq_prefix_len

const uint IndexSkipScanIterator::eq_prefix_len

◆ eq_prefixes

EQPrefix* IndexSkipScanIterator::eq_prefixes

◆ has_aggregate_function

bool IndexSkipScanIterator::has_aggregate_function

◆ index

uint IndexSkipScanIterator::index

◆ index_info

KEY* IndexSkipScanIterator::index_info

◆ max_range_key

uchar* const IndexSkipScanIterator::max_range_key

◆ max_search_key

uchar* const IndexSkipScanIterator::max_search_key

◆ max_used_key_length

uint IndexSkipScanIterator::max_used_key_length

◆ mem_root

MEM_ROOT* IndexSkipScanIterator::mem_root

◆ min_range_key

uchar* const IndexSkipScanIterator::min_range_key

◆ min_search_key

uchar* const IndexSkipScanIterator::min_search_key

◆ range_cond_flag

const uint IndexSkipScanIterator::range_cond_flag

◆ range_key_len

const uint IndexSkipScanIterator::range_key_len

◆ seen_first_key

bool IndexSkipScanIterator::seen_first_key

◆ start_key

key_range IndexSkipScanIterator::start_key

◆ used_key_parts

uint IndexSkipScanIterator::used_key_parts

The documentation for this class was generated from the following files: