由于本人水平有限,有错误的地方还请大家帮忙指正.
我们知道MySQL是一个插件式存储引擎的数据库,不同存储引擎的对象的元数据的存储方式是不一样的.例如:InnoDB的表的元数据信息都是存储在SYS_TABLES和SYS_INDEXES等数据字典中,数据结构也是dict_table_t 、dict_index_t等结构体,而MyISAM的表结构只有.frm文件存储.那么MySQL Server层怎样识别以及使用不同Engine的对象结构呢?
- TABLE_SHARE
TABLE_SHARE结构体主要成员如下:
struct TABLE_SHARE
{
TABLE_CATEGORY table_category; //表的类型
...
Field **field; //表的field字段
KEY *key_info; //表定义的KEY信息(即索引信息)
LEX_STRING table_cache_key; //TABLE_SHARE对象在table_cache中的key
LEX_STRING db; //表所在的DB name
LEX_STRING table_name; //表名
LEX_STRING path; //.frm文件路径名
// 指向每个table_cache包含该表的el地址 数组大小等于table_cache的数组大小
Table_cache_element **cache_element;
...
ulong version; //TABLE_SHARE的版本 如果版本变了 必须重新reopen
ulong mysql_version; /* 0 if .frm is created before 5.0 */
ulong reclength; //记录长度
ulong stored_rec_length; //存储的记录长度
uint ref_count; // TABLE 对象在使用的个数 即存在多少个TABLE对象
plugin_ref db_plugin; //存储引擎对象指针
...
}
当MySQL Server层在open table时,需要从frm文件(不区分存储引擎)中将这个表的表名、库名、所有的列信息、列的默认值、表的字符集、对应的.frm文件路径、所属的Engine、索引等信息存储到TABLE_SHARE结构体对象中,然后TABLE_SHARE对象在table_def_cache中缓存.(open_table_def中完成从frm到TABLE_SHARE写入)
- TABLE
每个连接到MySQL Server层的thread在获得TABLE_SHARE对象之后(所有的线程可以共用一个TABLE_SHARE对象),都会创建一个TABLE结构体的对象,这个对象是该thread在使用期间独占的.(open_table_from_share )
TABLE结构体精简如下:
struct TABLE
{
TABLE_SHARE*s; //TABLE_SHARE对象指针
handler*file; //存储引擎句柄 对存储引擎的操作通过该对象指针操作
TABLE *next, *prev; //TABLE对象前后节点指针
private:
TABLE *cache_next, **cache_prev;//用于table_cache中的list链表节点指针
friend class Table_cache_element; //用于访问cache_next和cache_prev两个成员
public:
THD*in_use;//thread 对象指针
Field **field;//表的列的存储对象 同TABLE_SHARE中的列
uchar *record[2];//记录数据的存储地址
uchar *write_row_record;//THE::write_row中优化使用
uchar *insert_values;//用于INSERT ... UPDATE
....
KEY*key_info;//表定义的KEY信息 同TABLE_SHARE
....
};
- Table_cache管理
class Table_cache_element
{// 缓存一个表名的所有TABLE对象 一个element对象只缓存一个表名的所有TABLE
private:
typedef I_P_List <TABLE,
I_P_List_adapter<TABLE,
&TABLE::cache_next,
&TABLE::cache_prev> > TABLE_list;
TABLE_list used_tables; // 正在使用的TABLE对象
TABLE_list free_tables; // 可以直接使用的TABLE 对象
TABLE_SHARE *share; // TABLE_SHARE 缓存对象
}
推荐阅读
- 转转MySQL机房迁移半小时结束战斗?
- 【科学的温度】ChatGPT被指没“人性”,可能产生哪些危害?
- 欧姆龙是哪个国家的品牌?Laneige兰芝是什么品牌?
- 平山白鹿温泉度假酒店.最近想去平山白鹿温泉,在哪里住一晚。玩个两天。帮忙推荐好点的住宿。
- 火爆的单机游戏排名--全球最火的十大单机游戏?
- 手机充电功率大小有什么区别—华为p30可以用多少w的充电器,别人说的只能接受22.5w的
- 央视网|内娱将被整顿!央视删除Z姓女星的全部内容,疑似与“文盲”有关
- 丁太升|李荣浩的新歌《乌梅子酱》出圈大火,丁太升犀利点评俗不可耐
- 银币|为何大清银币的价值会比一般银元的价值高很多
- 【科学的温度】体育中考调整耐力项目,青少年“阳康”后如何锻炼?