MySQL 源码链表的实现

MySQL源码关于链表的实现在ut0lst.h文件中,其设计思路与常规略有不同,基本思想是指针嵌于对象之内,如下图所示。

在这种实现方式下,构造一个链表需要同时指定对象类型和对象内指针节点的地址。为什么这么复杂呢?我们对比一下C++11标准库中list的实现,发现其就是一个模板类,构造一个list只需要传入对象类型即可,这更符合我们的理解。研究了下源码,也没找到这样设计的合理之处。突然想起了MySQL磁盘数据文件的存储格式,发现这种设计与其很相符。

简单来说,MySQL的数据文件(其实就是一个namespace)被分成了很多extent,每个extent包含64个page,也就是1M。那如何管理这些extent呢?没256个extent分为一组,每组的第一个page包含了256个extent_entry,每个entry包含64个page的状态和一个指针node,分别指向前后的entry,跟上面的图是不是很像?

现在来说一下为什么要这样设计。在内存中,我们可以使用两种设计方式:指针嵌于对象之内和对象嵌于节点之内。为什么C++11中list的实现只需要传入对象类型就可以呢?因为在代码里面我们可以直接通过符号来获取prev和next指针的值,那你想想磁盘上面list能这样做吗?肯定不行了啊,在磁盘上面我们只能通过地址或偏移来获取值。

其实上面说了这么多,总结下来就是一个问题:我们怎么把list持久化到磁盘中?上面给出了一种很好的实现。

再延伸一个问题:我们怎么把B+Tree持久化到磁盘中?MySQL索引就是这么干的,具体可以在网上找下这方面的介绍。

为什么不用C++11中list的实现?

以insert为例,首先我们要构造一个对象,然后再insert,这里面涉及到一次拷贝构造,降低了效率。(尽管是通过引用传参,但insert函数要把这个对象拷贝到list中)

struct Node {

Node() {

cout << "Construct." << endl;

}

Node(const Node &node) {

cout << "Copy construct." << endl;

}

};

int main() {

list l;

l.push_back(Node());

return 0;

}

Output:

Construct.

Copy construct.

如果采用MySQL的实现方案,可以直接在构造函数里面把当前对象的地址加入到list中,不需要再insert,效率极高,并且这样一来,我们只需要关注对象的创建,不需要关注list的更新。

MySQL源码中关于sys_var的实现也是这种方式,每个sys_var中都会包含一个next指针,用于串起整个sys_var,并用一个all_sys_vars作为base节点。

mysql跨服务器链表_MySQL 源码链表的实现相关推荐

  1. mysql+跨服务器+写入_MySQL中使用FREDATED引擎实现跨数据库服务器、跨实例访问

    跨数据库服务器,跨实例访问是比较常见的一种访问方式,在Oracle中可以通过DB LINK的方式来实现.对于MySQL而言,有一个FEDERATED存储引擎与之相对应.同样也是通过创建一个链接方式的形 ...

  2. mysql 跨服务器复制_mysql数据库跨服务器间复制与迁移

    mysql数据库跨服务器间复制与迁移 发布时间:2020-03-26 16:04 最近在试用一台新的web服务器,系统是Ubuntu的,昨天经过一阵子的apt-getdist-upgrade,apt- ...

  3. mysql insert执行过程_MySQL · 源码分析 · 一条insert语句的执行过程

    本文只分析了insert语句执行的主路径,和路径上部分关键函数,很多细节没有深入,留给读者继续分析 create table t1(id int); insert into t1 values(1) ...

  4. MySQL核心参数含义的源码解析

    引言 你访问的网站,大部分使用Apache服务器;你访问的网站,大部分使用Linux或BSD操作系统:你访问的网站,大部分使用MySQL数据库;你提交DNS域名查询请求大多由BIND服务器分析处理;你 ...

  5. jsp+servlet+mysql实现的图书管理系统源码

    此篇给大家推荐的是jsp+servlet+mysql实现的图书管理系统源码: 随着社会信息量的与日俱增,作为信息存储的主要媒体之一的图书,数量,规模比以往任何时候都大的多 不论个人还是图书管理部门都需 ...

  6. springboot+vue+mysql外卖点餐管理系统源码(包安装+讲解)

     博主介绍:✌在职Java研发工程师.专注于程序设计.源码分享.技术交流.专注于Java技术领域和毕业设计✌ 项目名称 springboot+vue+mysql外卖点餐管理系统源码(包安装+讲解) 视 ...

  7. Linux LNMP源码架构部署 | Nginx服务 | Mysql服务 | php服务 | 论坛源码编译安装 | 超详细

    | Nginx服务 | Mysql服务 | php服务 | 论坛源码编译安装 | ➤安装 Nginx 服务 ➤1.关闭防火墙和安全机制 ➤2.卸载自带的httpd服务 ➤3.安装依赖包 ➤4.创建运行 ...

  8. 《MySQL 8.0.22执行器源码分析(3.2)关于HashJoinIterator》

    在本文章之前,应该了解的概念: 连接的一些概念.NLJ.BNL.HashJoin算法. 目录 关于join连接 probe行保存概念 Hashjoin执行流程(十分重要) HashJoinIterat ...

  9. java+mysql学生学籍后台管理系统源码

    介绍: java+mysql学生学籍后台管理系统源码 网盘下载地址: http://kekewl.cc/ikZ3un3U9en0 图片:

最新文章

  1. Luogu 4721 【模板】分治 FFT
  2. 【华为大咖分享】3.如何做Code Review 与 结对编程?
  3. python 朋友圈自动回复评论_Python自动回复微信好友新年祝福
  4. xampp 403 禁止访问 问题解决
  5. javascript 函数定义的方式
  6. 腾讯微博模拟登陆+数据抓取(java实现)
  7. 递归算法和经典递归例子
  8. 人像抠图处理百度API接口调用
  9. 解决Jenkins集成SonarQube Scanner出现“Tasks support was removed in SonarQube 7.6.”的问题
  10. 创业者防坑手册:面对强大的资本力量,你该如何正当防卫?
  11. WebStorm下载其他版本(历史版本)
  12. 解决Navicat远程服务器2013-Lost connection to MYSQL server at 'waitting for initial communication packet'
  13. Spire.PDF:如何添加、删除PDF页面以及自定义文档属性
  14. [DP]hdu5234
  15. am5728 ipc开发总结
  16. 关于如何在win 10 中完成 ie 11 浏览器使用的解决方案(win7 升级 ie 11)
  17. 十六进制颜色码与RGB颜色值的转换
  18. Git修改用户名和邮箱
  19. 浏览器判断是否安装APP
  20. m基于MATLAB-GUI的GPS数据经纬度高度解析与kalman分析软件设计

热门文章

  1. android的Handler、Message机制*
  2. java语法优化小结
  3. html中隐藏内容蜘蛛会抓取吗,蜘蛛会抓取识别JS、CSS、JSON,对SEO有什么影响
  4. 【Unity开源项目精选】xLua:Unity热更新首选
  5. 【专栏精选】实战:使用LeanCloud实现玩家注册
  6. DotNetCore中异步编程的实用演练
  7. 电子邮件地址验证:详细解释,生产质量WPF文本框代码
  8. mysql master status_show master status为空解决办法
  9. html辅助方法以及常用属性值,ASP.NET MVC 2博客系列之一:强类型HTML辅助方法
  10. linux下访问西门子S7,Siemens SIMATIC S7-1200 CPU开放重定向漏洞(CVE-2015-1048)