表类定义了MySQL 数据库表在 MySQL 内存中的形式。表以两种形式存在——-打开或关闭状态。MySQL要想使用表,必须先将其打开。表描述类是在表被打开时创建。表描述类创建后会被置于表缓存(table_cache)中,等待下一个查询的重用,以提高访问的效率。
表描述类对象经常在查询解析、查询优化、访问控制和查询缓存代码中被引用。所以了解它的组成有助于读者对MySQL底层对表操作的理解。
sql下的table.h
公共成员函数
//优化和执行后重置字段状态
void reset ()
//初始化TABLE实例(新创建的实例,或来自表缓存或THD :: temporary_tables列表的实例),并准备在语句执行期间进一步使用。
void init (THD *thd, TABLE_LIST *tl)
//将表初始化为内部tmp表。
bool init_tmp_table (THD *thd, TABLE_SHARE *share, MEM_ROOT *m_root, CHARSET_INFO *charset, const char *alias, Field **fld, uint *blob_fld, bool is_virtual)
//为表中的每一列创建Item_field。
bool fill_item_list (mem_root_deque< Item *> *item_list) const
//重置现有的Item_field项目列表以指向该表的Fields
void reset_item_list (const mem_root_deque< Item *> &item_list) const
void clear_column_bitmaps (void)
//告诉handler我们将在稍后调用position()和rnd_pos()。
void prepare_for_position (void)
//根据mark_used将列标记为已读或已写(或无)。
void mark_column_used (Field *field, enum enum_mark_columns mark)
//标记键使用的列,但不要重置其他字段
void mark_columns_used_by_index_no_reset (uint index, MY_BITMAP *map, uint key_parts=0) const
void mark_columns_used_by_index (uint index)
//在读写映射中将自动递增字段标记为已使用字段
void mark_auto_increment_column (void)
//标记更新行所需的列。
void mark_columns_needed_for_update (THD *thd, bool mark_binlog_columns)
void mark_columns_needed_for_delete (THD *thd)
void mark_columns_needed_for_insert (THD *thd)
void mark_columns_per_binlog_row_image (THD *thd)
//在执行更新和插入操作时,更新生成列的write / read_set。
void mark_generated_columns (bool is_update)
//将生成的列及其依赖项添加到read_set / write_set位图。
void mark_gcol_in_maps (const Field *field)
//在执行更新和插入操作时,使用检查约束评估所需的列更新read_map。
void mark_check_constraint_columns (bool is_update)
void column_bitmaps_set (MY_BITMAP *read_set_arg, MY_BITMAP *write_set_arg)
void column_bitmaps_set_no_signal (MY_BITMAP *read_set_arg, MY_BITMAP *write_set_arg)
void use_all_columns ()
void default_column_bitmaps ()
//应该重新打开该表的实例吗?
bool needs_reopen ()
Field ** visible_field_ptr () const
uint visible_field_count () const
//为物化派生表分配键的空间。
bool alloc_tmp_keys (uint new_key_count, uint new_key_part_count, bool modify_share)
//将一个键添加到实例化派生表。
bool add_tmp_key (Field_map *key_parts, bool invisible, bool modify_share)
//对于物化派生表:将KEY定义从某个位置复制到第一个尚未使用的位置(较低的位置)
void copy_tmp_key (int old_idx, bool modify_share)
//对于物化的派生表:在copy_tmp_key()复制了所有已用键的定义之后,在TABLE :: key_info中,我们有一个已用键的头,后跟一个未用键的尾;此功能可消除尾巴。
void drop_unused_tmp_keys (bool modify_share)
void set_keyread (bool flag)
//检查给定索引是否具有虚拟生成的列。
bool index_contains_some_virtual_gcol (uint index_no) const
//为单个表UPDATE / DELETE查询更新TABLE :: const_key_parts
bool update_const_key_parts (Item *conds)
//如果所选的快速读取方法正在使用完全唯一索引,则可以删除读取。
bool check_read_removal (uint index)
ptrdiff_t default_values_offset () const
bool has_storage_handler () const
// 为临时表设置存储handler
void set_storage_handler (handler *file_arg)
//如果表已实例化,则返回true,否则返回false
bool is_created () const
//将表设置为“ created”,并启用没有实例化表无法启用的存储引擎中的标志。
void set_created ()
//删除内容后,将表的内容设置为“删除”,即“未创建”。
void set_deleted ()
//将表设置为可为空,即它在某些外部联接的内部。
void set_nullable ()
//返回表是否为空
bool is_nullable () const
bool has_gcol () const
//行缓冲区的生命周期如下
void set_not_started ()
bool is_started () const
// 设置行缓冲区的状态:包含行
void set_found_row ()
//设置行缓冲区的状态:不包含任何行。
void set_no_row ()
//从handler的结果中设置“row found”状态
void set_row_status_from_handler (int status)
//将当前行设置为“空行”,以用于空补充的外部联接
void set_null_row ()
//对当前行清除设置到“null now”的状态
void reset_null_row ()
//为当前行设置”updated"属性
void set_updated_row ()
//为当前行设置“deleted"属性
void set_deleted_row ()
bool has_row () const
bool has_null_row () const
bool has_updated_row () const
bool has_deleted_row () const
//将当前行的NULL标志保存到指定的缓冲区中
void save_null_flags ()
//从指定的缓冲区还原当前行的NULL标志。
void restore_null_flags ()
//清空内部临时表(删除行,关闭扫描)
bool empty_result_table ()
//初始化优化程序成本模型。
void init_cost_model (const Cost_model_server *cost_model_server)
//返回此表的成本模型对象
const Cost_model_table * cost_model () const
//修复表的生成列(GC)和/或默认表达式
void refix_value_generator_items (THD *thd)
//refix_value_generator_items()的辅助函数,用于修复一列的表达式(无论是GC还是默认表达式)并检查约束表达式。
void refix_inner_value_generator_items (Value_generator *g_expr)
//清除与生成的列关联的项目中的任何状态,以准备下一条语句。
void cleanup_value_generator_items ()
void set_tmp_table_seq_id (uint arg)
//根据最大读取密钥长度更新覆盖密钥。
void update_covering_prefix_keys (Field *field, uint16 key_read_length, Key_map *covering_prefix_keys)
//该表在当前行中是否有可以使用部分更新来更新的列?
bool has_binary_diff_columns () const
//获取已为当前行中的给定列收集的二进制差异列表,如果无法对该列使用部分更新,则返回nullptr。
const Binary_diff_vector * get_binary_diffs (const Field *field) const
//将给定列标记为可以在执行update语句期间使用部分更新来更新的列。
bool mark_column_for_partial_update (const Field *field)
//此列是否已标记为部分更新?
bool is_marked_for_partial_update (const Field *field) const
//该表是否有标记为mark_column_for_partial_update()的列?
bool has_columns_marked_for_partial_update () const
//在此表中启用JSON列的部分更新。
bool setup_partial_update (bool logical_diffs)
bool setup_partial_update ()
//为使用部分更新更新的列添加二进制差异。
bool add_binary_diff (const Field *field, size_t offset, size_t length)
//清除为JSON列的部分更新而收集的差异,并为临时禁用当前行的部分更新的所有列重新启用部分更新。
void clear_partial_update_diffs ()
//清理用于部分更新JSON列的状态。
void cleanup_partial_update ()
//暂时禁用当前行中某一列的二进制差异集合。
void disable_binary_diffs_for_current_row (const Field *field)
//暂时禁止收集描述当前行中JSON列的逻辑更改的Json_diff对象。
void disable_logical_diffs_for_current_row (const Field *field) const
//获取一个缓冲区,该缓冲区可用于在执行部分更新时保存部分更新的列值。
String * get_partial_update_buffer ()
//将描述逻辑更改的逻辑JSON差异添加到部分更新中的JSON列
void add_logical_diff (const Field_json *field, const Json_seekable_path &path, enum_json_diff_operation operation, const Json_wrapper *new_value)
//获取已为当前行中的给定列收集的JSON差异列表,如果无法对该列使用部分更新,则返回nullptr。
const Json_diff_vector * get_logical_diffs (const Field_json *field) const
//是否在此JSON列上启用了使用二进制差异进行的部分更新?
bool is_binary_diff_enabled (const Field *field) const
//是否在此JSON列上启用了使用逻辑差异的部分更新?
bool is_logical_diff_enabled (const Field *field) const
//BLOB类型的虚拟字段具有标志m_keep_old_value。
void blobs_need_not_keep_old_value ()
//设置变量should_binlog_drop_if_temp_flag,以便可以确定临时表的日志记录。
void set_binlog_drop_if_temp (bool should_binlog)
bool should_binlog_drop_if_temp (void) const
公共属性
TABLE_SHARE * s {nullptr}
handler * file {nullptr}
TABLE * next {nullptr}
TABLE * prev {nullptr}
//一个位图,标记存在的功能索引存在的隐藏的已生成列。
MY_BITMAP fields_for_functional_indexes
THD * in_use {nullptr}
Field ** field {nullptr}
//隐藏字段的计数(如果有内部临时表);否则为0。
uint hidden_field_count {0}
uchar * record [2] {nullptr, nullptr}
uchar * write_row_record {nullptr}
uchar * insert_values {nullptr}
//用于多行读取的缓冲区。最初是空的。
Record_buffer m_record_buffer {0, 0, nullptr}
Key_map covering_keys
Key_map quick_keys
Key_map merge_keys
Key_map possible_quick_keys
Key_map keys_in_use_for_query
Key_map keys_in_use_for_group_by
Key_map keys_in_use_for_order_by
KEY * key_info {nullptr}
// 生成键的键部分数组,用于物化派生表
KEY_PART_INFO * base_key_parts {nullptr}
Field * next_number_field {nullptr}
Field * found_next_number_field {nullptr}
//指向生成的列的指针
Field ** vfield {nullptr}
//指向具有默认值的字段的指针。
Field ** gen_def_fields_ptr {nullptr}
//唯一约束使用的字段。
Field * hash_field {nullptr}
Field * fts_doc_id_field {nullptr}
Table_trigger_dispatcher * triggers {nullptr}
TABLE_LIST * pos_in_table_list {nullptr}
TABLE_LIST * pos_in_locked_tables {nullptr}
ORDER * group {nullptr}
//表的别名
const char * alias {nullptr}
//指向记录[0]的空标志的指针
uchar * null_flags {nullptr}
//当null_row为true时保存null_flags。
uchar * null_flags_saved
MY_BITMAP def_read_set
MY_BITMAP def_write_set
MY_BITMAP tmp_set
MY_BITMAP pack_row_tmp_set
MY_BITMAP cond_set
//表字段(列)的位图,在INSERT INTO语句中明确设置
MY_BITMAP def_fields_set_during_insert
//设置优化器打算读取的所有列。
MY_BITMAP * read_set {nullptr}
MY_BITMAP * write_set {nullptr}
//指向表字段(列)的位图的指针,该字段在INSERT INTO语句中明确设置
MY_BITMAP * fields_set_during_insert {nullptr}
query_id_t query_id {0}
ha_rows quick_rows [MAX_KEY] {0}
key_part_map const_key_parts [MAX_KEY] {0}
uint quick_key_parts [MAX_KEY] {0}
uint quick_n_ranges [MAX_KEY] {0}
ha_rows quick_condition_rows {0}
uint lock_position {0}
uint lock_data_start {0}
uint lock_count {0}
uint db_stat {0}
int current_lock {0}
Sql_table_check_constraint_list * table_check_constraint_list {nullptr}
bool null_row {false}
bool copy_blobs {false}
bool force_index {false}
//语句包含FORCE INDEX FOR ORDER BY时设置的标志,请参见TABLE_LIST :: process_index_hints()
bool force_index_order {false}
//语句包含FORCE INDEX FOR GROUP BY时设置的标志,请参见TABLE_LIST :: process_index_hints()
bool force_index_group {false}
bool const_table {false}
//如果写入此表不应写入行,而仅写入键,则为True。
bool no_rows {false}
//如果设置,优化器发现行检索应仅访问索引树。
bool key_read {false}
//某些需要整行的语句将其设置为禁止仅索引访问。
bool no_keyread {false}
//如果设置,指示服务器未复制该表
bool no_replicate {false}
bool fulltext_searched {false}
bool no_cache {false}
bool open_by_handler {false}
//指示auto_increment字段的值是由用户或其他来源显式提供的
bool autoinc_field_has_explicit_non_null_value {false}
bool alias_name_used {false}
bool get_fields_in_item_tree {false}
//该表是否必须重新打开,并且不能重复使用
bool m_needs_reopen {false}
//是否物化,true:是的
bool materialized {false}
struct {
class JOIN_TAB * join_tab {nullptr}
class QEP_TAB * qep_tab {nullptr}
thr_lock_type lock_type {TL_UNLOCK}
thr_locked_row_action locked_row_action {THR_DEFAULT}
bool not_exists_optimize {false}
bool impossible_range {false}
} reginfo
MEM_ROOT mem_root
//如果GROUP_CONCAT与ORDER BY | | |一起使用,则在Item_func_group_concat :: setup中为适当的临时表初始化。 DISTINCT和BLOB字段计数>0。
Blob_mem_storage * blob_storage {nullptr}
//不归表所有;仅用于filesort_free_buffers()
SortingIterator * sorting_iterator {nullptr}
SortingIterator * duplicate_removal_iterator {nullptr}
//如果对表应用唯一操作(按行ID)的结果
Sort_result unique_result
partition_info * part_info {nullptr}
bool all_partitions_pruned_away {false}
MDL_ticket * mdl_ticket {nullptr}
私有属性
//Table_cache特定实例中特定表的已使用/未使用TABLE对象列表的链接(换言之,特定Table_cache_element对象)。
TABLE * cache_next {nullptr}
TABLE ** cache_prev {nullptr}
//如果为true,则此表为内部表。
bool nullable {false}
uint8 m_status {0}
//针对临时表
bool created {false}
//此表上操作的成本模型对象。
Cost_model_table m_cost_model
//内部tmp表序号
uint tmp_table_seq_id {0}
//位图,在更新语句中告诉哪些列适合部分更新
MY_BITMAP * m_partial_update_columns {nullptr}
//包含执行时间状态的对象,用于部分更新JSON列。
Partial_update_info * m_partial_update_info {nullptr}
//这个标志决定了我们是否应该记录放置临时表命令。
bool should_binlog_drop_if_temp_flag {false}