腾讯大讲堂42 数据库内核设计思路浅析
DESCRIPTION
腾讯大讲堂42 数据库内核设计思路浅析TRANSCRIPT
![Page 1: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/1.jpg)
数据库通用设计思路浅析
Alexyang无线产品部开发组
20080804
![Page 2: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/2.jpg)
提纲
体系结构
系统实现的关键技术
![Page 3: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/3.jpg)
体系结构
![Page 4: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/4.jpg)
服务器核心系统总体结构客户 客户 客户
TCP/IP网络
连接监听线程
总控线程 检查点线程
工作线程
工作线程
工作线程
任务队列
系统 /日志缓冲
读 /写线程 日志线程
DB
会话线程
![Page 5: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/5.jpg)
线索主要有
控制台线索 工作线索 I/O 线索 会话线索 连接监听线索 日志线索 检查点线索 备份线索
![Page 6: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/6.jpg)
工作线程工作流程
从任务队列中取得任务
是否为通讯请求
是
通讯请求的处理 SQL 语句任务的处理
否
![Page 7: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/7.jpg)
会话线程
处于死循环中,保持接收客户请求,放入
系统任务队列,由工作线索取出执行。
![Page 8: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/8.jpg)
连接监听线索
创建结构地址和 socket ,进行两者的绑定
,开始监听。不断检查是否有客户端的连
接请求,若有则将它放入客户端队列,继
续检查是否有新的客户端来的请求。
![Page 9: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/9.jpg)
控制台线索
当数据库用 console 启动时,有些数据库是
支持在该 console 下输入命令以得到相关信
息,比如锁信息等等。
![Page 10: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/10.jpg)
日志线索
进行日志的刷盘操作。
![Page 11: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/11.jpg)
系统实现的关键技术
![Page 12: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/12.jpg)
服务器主要模块
通讯子系统
语言分析器
查询优化器
解释执行器
系统缓冲区管理子系统
并发控制 / 封锁子系统
事务管理子系统
日志管理模块
备份和恢复模块
物理存储模块
![Page 13: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/13.jpg)
语法 /词法分析
负责解析 SQL 命令和过程性语句块
过滤注释 , 解析参数
使用成熟的工具(如 YACC/LEX )生成
灵活的语法规则定义
便于语法的扩展与修改
生成统一格式的语法树
![Page 14: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/14.jpg)
举例
from_tv_list :
from_tv
{
$$ = (par_from_tv_list_t *)new_node(PAR_FROM_TV_LIST,1);
$$->un_1.from_tv_list_1.from_tv = $1;
}
| from_tv ',' from_tv_list
{
$$ = (par_from_tv_list_t *)new_node(PAR_FROM_TV_LIST,2);
$$->un_1.from_tv_list_2.from_tv_list = $3;
$$->un_1.from_tv_list_2.from_tv = $1;
};
![Page 15: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/15.jpg)
struct par_from_tv_list_struct
{
ulint par_type; //值为 PAR_FROM_TV_LIST: 1134
ulint par_tag; //1:规则 1; 2:规则 2
ulint par_lineno;
union
{
struct
{
par_from_tv_t *from_tv; //$1
}from_tv_list_1; //规则 1
struct
{
par_from_tv_t* from_tv; //$1
par_from_tv_list_t* from_tv_list; //$3
}from_tv_list_2; //规则 2
}un_1;
};
![Page 16: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/16.jpg)
对应的语法结构
Select * from t1, t2, t3;
par_from_tv_list_struct 结构
par_from_tv_list_t* from_tv_list;
par_from_tv_t* from_tv
par_from_tv_list_struct 结构
par_from_tv_list_t* from_tv_list;
par_from_tv_t* from_tv
par_from_tv_list_struct 结构
par_from_tv_t* from_tv
par_from_tv_struct结构
T1
par_from_tv_struct结构
T2
par_from_tv_struct结构
T3
规则2 规
则1
![Page 17: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/17.jpg)
语义分析
数据库对象名字解析
合法性检查
内部 ID 的转换
权限检查
语法树数据结构的简化与预处理
DDL 语句分解为对系统表的 DML
视图对象的替换等
![Page 18: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/18.jpg)
代价优化器
接受语义分析的输入
统计信息的分析 数据分布
统计直方图
代价的计算 基于统计信息
操作符号的选择
基于成本的最优执行路径选择
生成优化的执行计划
![Page 19: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/19.jpg)
基于操作符的执行计划
物理操作符功能简单专一 , 完成特定的数据库操作
如 : 连接 , 过滤 , 排序等
执行计划操作符的组合 , 构成树型的执行计划
执行时 , 数据从叶子向根流动
在根汇集成结果集 , 或者得到结果状态
计划被自动缓存 , 以备重用
![Page 20: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/20.jpg)
执行计划 1
![Page 21: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/21.jpg)
执行计划 2
![Page 22: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/22.jpg)
系统缓冲区管理子系统
内存池:使用伙伴系统管理内存。
内存堆:多次申请一次释放,提升了内存使用效率,同时也很好地解决了内存泄漏的问题。
数据缓冲区:采用 LRU 提高命中率,提升I/O 性能。
日志缓冲区:集中写入,提升性能。
![Page 23: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/23.jpg)
事务和线程的分离
事务对应于用户连接 / 会话 (SESSION)每个连接,有一个活动的事务
工作线程是共享资源
一组工作线程,协同工作,为所有的事务服务
数据库对象的封锁失败,导致事务暂停,却不会阻塞工作线程
提高 CPU 的利用率
![Page 24: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/24.jpg)
事务和线程的分离
事务对应于用户连接 / 会话 (SESSION)每个连接,有一个活动的事务
工作线程是共享资源
一组工作线程,协同工作,为所有的事务服务
数据库对象的封锁失败,导致事务暂停,却不会阻塞工作线程
提高 CPU 的利用率
![Page 25: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/25.jpg)
数据库锁和线程锁
数据库锁
针对数据库对象
用户可干预
锁定失败 ,导致事务暂停或事务回滚
线程锁
针对核心系统资源
锁定失败 ,导致线程被挂起
用户不能干预
设计时 ,采用严格的规则 ,防止出现死锁
![Page 26: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/26.jpg)
回滚段
记录每一个数据库操作的逻辑动作
插入 /删除 /更新
在对聚集索引更新时 , 生成回滚记录
每个事务对应一个回滚段
事务回滚时 ,扫描回滚段 ,做插入 /删除 /更新的
反动作
回滚记录也是数据复制的基础
![Page 27: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/27.jpg)
重做 (REDO)日志
日志数据的构成:物理页的修改信息
日志中不记录逻辑上的数据库操作,如 :插入,删除等
逻辑上的数据库操作,被记录在回滚段上
恢复时,以完整的物理事务为单位
最后一个不完整的物理事务被丢弃
日志对回滚段和普通的数据文件同样处理
物理恢复完成后,按照回滚段上的逻辑操作,对
未提交的事务做相应的反动作,以取消这个事务
![Page 28: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/28.jpg)
分层设计 /优化
隔离 CPU 的特性高地址高位 (INTEL)低地址高位 (SPARC)
隔离OS 特性文件系统
线程
同步原语
充分利用 LINUX 2.6 核心
![Page 29: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/29.jpg)
问题 ?
![Page 30: 腾讯大讲堂42 数据库内核设计思路浅析](https://reader034.vdocuments.site/reader034/viewer/2022042502/5598144b1a28ab671d8b4575/html5/thumbnails/30.jpg)
谢谢 !