数据库需经历各种取舍与权衡

热点 | 2021-01-28 08:53:25
时间:2021-01-28 08:53:25   /   来源: Tomcat那些事儿公众号      /   点击数:()

数据库做为我们日常开发的一个组件或者说基础服务,也许有人认为把它当个黑盒直接用就好,费那事儿干嘛。确实数据库的设计也做到了让我们不了解也能干活。但实际开发中往往会遇到性能退化、遇到bug,遇到服务问题等等,对数据库了解一些,就能更快的恢复,减少风险。

另外,作为经过多年发展,近乎成熟的产品,数据库里有不少有意思的地方。这里面对于设计一个数据库,一个存储引擎有大量的工作,以及各种取舍与权衡。比如最容易想到的,写入的时候如果顺序写,那数据插入效率更快,但如果是按某个顺序来检索,就必须得查出来再重新排序。比如数据怎样序列化,协议怎样组织,索引是怎样工作的,查询分析器、执行计划这些是怎样工作的,怎样挑选执行计划从而来保证查询的高效;另外数据库里数据是怎样组织来保证数据的存储、压缩来优化空间占用,又是怎样提升磁盘到内存中的访问速度,怎样做垃圾回收的......

最近看了一些数据库相关的书、文章等内容感觉不错,后面打算根据自己的理解写一写,也会选一些优质的英文文章翻译。

今天是翻译的第一篇。

数据库是什么?

概括来讲,数据库是一系列可以方便的访问和修改的数据的集合。

所有数据库管理系统的主要工作都是可靠的存储数据并使其对用户可用。

甚至说简单的一堆文件都可以做到轻松访问和修改这一点。实际上,像SQLite这类简单的数据库也确实仅是一堆文件。但是,SQLite 它是一些经过精心设计的文件,因为它允许执行这些操作:

通过事务来保证数据安全和一致

可以快速处理数百万量级的数据

概括来看,一个数据库可以看成以下图这些部分组成:

在很多书籍或论文里,对于数据库的描述都有自己的方式。比如『数据库技术内幕』一书组件插图是这样的:

所以不用太关注我们是怎样组织这些组成部分或者太关注处理流程怎样命名,因为我们做了一些取舍以适合这篇文章的编写。你需要重点关注的是这些不同的组成部分。

总体理解就是将数据库可以划分成多个相互交互组件。

核心组件

流程管理器:多数数据库都有一个需要管理的「池」,用来组织流程、线程等。甚至,为了取得纳秒级等极致性能,一些现代的数据库会使用其自己的线程,而不再是基于操作系统的线程。

网络管理器:网络的 I/O 一直是很重要的部分,特别是对分布式数据库来说。这也是为什么一些数据库实现自己的网络管理器的原因。

文件系统管理器:数据库遇到第一个瓶颈是磁盘 I/O。有一个能够完美处理操作系统文件系统甚至替换它的文件系统管理器相当重要。

内存管理器:为了避免磁盘I/O带来的影响,需要大量的内存。但是当你需要管理大量的内存的时候,就会需要一个高效的内存管理器。特别是你有多个查询同时在用内存查询的时候。

安全管理器:用于管理用户的身份验证和授权

客户端管理器:用于管理客户端的连接

工具

备份管理器:用来备份和还原数据库

恢复管理器:用来在数据库崩溃之后,以一致的状态来重新启动数据库

监控管理器:用来记录数据库的活动日志并提供监控数据

「管理」管理器:提供工具来管理数据库、表空间、模式,并管理像表的名称、结构等数据库的元数据

查询管理器

查询解析器:检查查询是否合法,像SQL语句有没有词法、语法错误这种

查询重写器:预优化查询

查询优化器:优化查询,让查询可以更高效的执行

查询执行器:编译和执行查询

数据管理器

事务管理器:处理事务

缓存管理器:和我们常用缓存一样理解,在使用前先把他们放到内存,在数据写到磁盘前也放到内存

数据访问管理器:访问磁盘上的数据

标签: 数据库

最近更新