MYSQL和INNODB分层实现

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 原创 水平有限 open table 的时候 当初次open table的时候会生成一个table_shared结构体 这个结构体记录 很多来自frm 的信息,基本就是表的定义,我们叫他为静态缓存 换句话说这个东西整个mysql 一个 接口为get_table_...
原创 水平有限

open table 的时候 当初次open table的时候会生成一个table_shared结构体 这个结构体记录
很多来自frm 的信息,基本就是表的定义,我们叫他为静态缓存 换句话说这个东西整个mysql 一个
接口为get_table_share
然后会每个连接线程会打开这个表的时候会根据table_shared出来的信息建立一个table结构体
这个结构体是动态的,每个会话都会建立一个,他会将实际的信息传递到innodb 层次,
最后打开innodb 的表,当然这个动态的table结构体会在table shared中有链表用来连接。
接口为open_table_from_share
请自行参考运维内参第四章,这里简单提了一下

这里主要说多态是怎么发生的。
多态成立3个条件
1、虚函数重写
2、继承
3、父类指针指向之类对象


1、
MYSQL层次和INNODB交互多态核心对象:
handler handler是基类,这个基类是在MYSQL层次的位于Handler.h中
ha_innobase: public handler  这个是继承类来自于MYSQL的handler基类,他位于innodb层,在Ha_innodb.h中
这里完成条件2


2、继承这里以open为例
在handler类中有一个函数
handler::ha_open,他里面调用了方法open比如
 if ((error=open(name,mode,test_if_locked)))
那么这里我们看看open在MYSQL层次中的定义为
  virtual int open(const char *name, int mode, uint test_if_locked)=0;
可以看到他是纯虚函数
  我们在看看Ha_innodb.cc中有这样的函数实现
  int
ha_innobase::open(
/*==============*/
const char* name, /*!< in: table name */
int mode, /*!< in: not used */
uint test_if_locked) /*!< in: not used */
)
这里完成了虚函数从写,也就完成了条件1

3、
在TABLE类中有这样一个句柄
handler *file;

在open_table_from_share会执行
outparam->file= get_new_handler(share, &outparam->mem_root,share->db_type()))) //db_type 引擎类型  db_plugin /* storage engine plugin */

if ((file= db_type->create(db_type, share, alloc)))
    file->init();
    DBUG_RETURN(file);
这里的指针是db_type->create返回的值,这里的db_type为innobase,这里db_type->create为一个函数指针
handler *(*create)(handlerton *hton, TABLE_SHARE *table, MEM_ROOT *mem_root);
他指向了
handler* innobase_create_handler(handlerton* hton, /*!< in: InnoDB handlerton */ TABLE_SHARE* table,MEM_ROOT* mem_root)

通过这里outparam->file已经指向了一个引擎层次的一个具体化的实例,这里完成条件3父类指针指向之类对象
也就是handler指针指向了ha_innobase

那么这里3个条件都已经满足,多态发生了

下面以open 为例,我们知道这个open函数在innodb 层次已经虚函数重写

在open_table_from_share的最后会实际的打开表
if ((ha_err= (outparam->file->
                  ha_open(outparam, share->normalized_path.str,
                          (db_stat & HA_READ_ONLY ? O_RDONLY : O_RDWR),
                          (db_stat & HA_OPEN_TEMPORARY ? HA_OPEN_TMP_TABLE :
                           (db_stat & HA_WAIT_IF_LOCKED) ?
                           HA_OPEN_WAIT_IF_LOCKED :
                           (db_stat & (HA_ABORT_IF_LOCKED | HA_GET_INFO)) ?
                          HA_OPEN_ABORT_IF_LOCKED :
                           HA_OPEN_IGNORE_IF_LOCKED) | ha_open_flags))))
我们主要关注下这里的多态
我们知道ha_open实际会调用open,open在innodb层次已经重写,而outparam->file正是这样一个
指针,他指向了innodb层的具体实例,当ha_open中执行
if ((error=open(name,mode,test_if_locked)))
就已经调用了innodb层次的ha_innobase::open,完成了层次的划分,也是模块的划分。其实一切
都是以C/C++多态的基础实现的。



作者微信:

               
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
19天前
|
存储 监控 关系型数据库
MySQL 参数innodb_read_io_threads
`innodb_read_io_threads` 是 MySQL 数据库中 InnoDB 存储引擎的一个配置参数,它用于指定后台线程池中用于处理读取 I/O 请求的线程数量。InnoDB 存储引擎负责管理数据库的物理存储和检索,是 MySQL 最常用的存储引擎之一。 ### 参数说明 - **名称**: `innodb_read_io_threads` - **默认值**: 4 - **范围**: 1 到 64 - **动态修改**: 不能动态修改(需要重启服务器) - **适用版本**: MySQL 5.6 及以上版本 ### 作用 `innodb_read_io_threads`
|
21天前
|
运维 负载均衡 关系型数据库
MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构
MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构
|
21天前
|
存储 SQL 关系型数据库
mysql中MyISAM和InnoDB的区别是什么
mysql中MyISAM和InnoDB的区别是什么
19 0
|
21天前
|
存储 关系型数据库 MySQL
【MySQL系列笔记】InnoDB引擎-数据存储结构
InnoDB 存储引擎是MySQL的默认存储引擎,是事务安全的MySQL存储引擎。该存储引擎是第一个完整ACID事务的MySQL存储引擎,其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有效地利用以及使用内存和 CPU。因此很有必要学习下InnoDB存储引擎,它的很多架构设计思路都可以应用到我们的应用系统设计中。
221 4
|
21天前
|
存储 监控 关系型数据库
【MySQL】InnoDB 什么情况下会产生死锁
【MySQL】InnoDB 什么情况下会产生死锁
|
5天前
|
存储 NoSQL 关系型数据库
mysql 数据库 基本介绍
mysql 数据库 基本介绍
|
1天前
|
SQL 关系型数据库 MySQL
mysql 数据库导出导入到本地文件
mysql 数据库导出导入到本地文件
|
1天前
|
Prometheus 监控 关系型数据库
数据库同步革命:MySQL GTID模式下主从配置的全面解析
数据库同步革命:MySQL GTID模式下主从配置的全面解析
10 0
|
1天前
|
SQL 监控 关系型数据库
MySQL慢查询日志配置指南:发现性能瓶颈,提升数据库效率
MySQL慢查询日志配置指南:发现性能瓶颈,提升数据库效率
7 0
|
1天前
|
关系型数据库 MySQL 分布式数据库
数据库专家带你体验PolarDB MySQL版 Serverless的极致弹性特性
作为数据库专家,我有幸带大家深入体验阿里巴巴自主研发的下一代关系型分布式云原生数据库——PolarDB MySQL版的Serverless极致弹性特性。在这个云原生和分布式技术飞速发展的时代,Pola