数据库基础与原理
核心组件
进程管理器
- 很多数据库具备一个需要妥善管理的进程/进程池,为了实现纳秒级操作,一些现代数据库使用自己的线程而不是操作系统线程
网络管理器
- 网络I/O是个问题,尤其是对于分布式数据库,所以一些数据库具备自己的网络管理器
文件系统管理器
- 磁盘I/O是数据库的首要瓶颈,具备一个文件系统管理器来完美处理OS文件系统甚至取代OS文件系统,是非常重要的
内存管理器
- 为了避免磁盘I/O带来的性能损失,需要大量的内存,如果需要处理大容量内存就需要高效的内存管理器
安全管理器
- 用于用户的验证和授权
客户端管理器
- 用于管理客户端连接
工具
备份管理器
- 用于保存和恢复数据
恢复管理器
- 用于崩溃后重启数据库到一个一致状态
监控管理器
- 用于记录数据库活动信息和提供监控数据库的工具
管理员管理器
- 用于保存元数据,提供管理数据库、模式、表空间的工具
查询管理器
查询解析器
- 用于检查查询是否合法
查询重写器
- 用于预优化查询
查询优化器
- 用于优化查询
查询执行器
- 用于编译和执行查询
数据管理器
事务管理器
- 用于处理事务
缓存管理器
- 数据被使用之前置于内存,或者数据写入磁盘之前置于内存
数据访问管理器
- 访问磁盘中的数据
数据查询的流程
客户端管理器
-
客户端可以是一个浏览器或者一个最终用户,客户端管理器通过一系列知名的API(JDBC、ODBC、OLE-DB)提供不同的方式来访问数据库。客户端管理器也提供专有的数据库访问API
-
连接数据库执行查询的流程
- 管理器首先检查你的验证信息如用户名和密码,然后检查你是否访问数据库的权限,权限有DBA分配
- 然后管理器检查是否有空闲进程来处理你的查询
- 管理器还会检查数据库是否负载很重
- 管理器可能需要等待一会获取需要的资源,如果等待时间达到超时时间,它会关闭连接并给出一个可读的错误消息
- 然后管理器会把你的查询送给查询管理器来处理
- 因为查询处理不是“不全则无”的,一旦从查询管理器得到数据,它会把部分结果保存到一个缓冲区并开始给你发送
- 如果遇到问题,管理器关闭连接,向你发送可读的解释信息,然后释放资源
查询管理器
-
查询流程
- 查询首先被解析并判断是否合法
- 然后被重写,去除了无用的操作并且加入预优化部分
- 接着被优化以便提升性能,并被转换为可执行代码和数据访问计划
- 然后计划被编译
- 最终被执行
-
查询解析器
-
会检查sql语句的语法,如SELECT等关键字编写错误,或是WHERE写在SELECT之前会被拒绝
-
分析查询中的表和字段,使用数据库元数据来检查
- 表是否存在
- 表的字段是否存在
- 对某类字段的运算是否可能,如对一个整数使用字符串切割函数,这是不允许的
-
检查是否有权限执行当前的语句
-
解析过程中,sql查询被转换为内部表示
-
如果一切正常,内部表示被送到查询重写器
-
-
查询重写器
-
目标
- 预优化查询
- 避免不必要的运算
- 帮助优化器找到合理的最佳解决方案
-
通过以下规则对查询进行检测
- 视图合并,如果在查询中使用视图,视图会转换为它的sql代码
- 子查询扁平化,子查询是很难优化的,因此重写器会尝试移除子查询
- 去除不必要的运算符,比如使用了DISTINCT,如果已经有了UNIQUE约束,那么就没有必要使用DISTINCT,可去掉
- 排除冗余的联接,如果相同的JOIN条件出现两次,比如隐藏在视图中的JOIN条件,或者由于传递产生无用JOIN都会被消除
- 常数计算赋值,如果查询需要计算,那么在重写过程中计算会执行一次,比如where age > 10+2会转换为where age > 12
- *分区裁剪,如果用了分区表,重写其能够找到需要使用的分区
- *物化视图重写,如果有个物化视图匹配查询谓词的一个子集,重写器将检查视图是否最新并修改查询,令查询使用物化视图而不是原始表
- *自定义规则,如果有自定义规则来修改查询,重写器就会执行这些规则
- *OLAP转换,分析/加窗函数,星形连接,ROLLUP函数等等都会发生转换
-
-
查询优化器