数据库是咋工作的?你知道不?
数据库做为我们日常开发的一个组件或者说基础服务,也许有人认为把它当个黑盒直接用就好,费那事儿干嘛。确实数据库的设计也做到了让我们不了解也能干活。但实际开发中往往会遇到性能退化、遇到bug,遇到服务问题等等,对数据库了解一些,就能更快的恢复,减少风险。
另外,作为经过多年发展,近乎成熟的产品,数据库里有不少有意思的地方。这里面对于设计一个数据库,一个存储引擎有大量的工作,以及各种取舍与权衡。比如最容易想到的,写入的时候如果顺序写,那数据插入效率更快,但如果是按某个顺序来检索,就必须得查出来再重新排序。比如数据怎样序列化,协议怎样组织,索引是怎样工作的,查询分析器、执行计划这些是怎样工作的,怎样挑选执行计划从而来保证查询的高效;另外数据库里数据是怎样组织来保证数据的存储、压缩来优化空间占用,又是怎样提升磁盘到内存中的访问速度,怎样做垃圾回收的......
最近看了一些数据库相关的书、文章等内容感觉不错,后面打算根据自己的理解写一写,也会选一些优质的英文文章翻译。
今天是翻译的第一篇。
数据库是什么?
概括来讲,数据库是一系列可以方便的访问和修改的数据的集合。
所有数据库管理系统的主要工作都是可靠的存储数据并使其对用户可用。
甚至说简单的一堆文件都可以做到轻松访问和修改这一点。实际上,像SQLite这类简单的数据库也确实仅是一堆文件。但是,SQLite 它是一些经过精心设计的文件,因为它允许执行这些操作:
-
通过事务来保证数据安全和一致
-
可以快速处理数百万量级的数据
概括来看,一个数据库可以看成以下图这些部分组成:
在很多书籍或论文里,对于数据库的描述都有自己的方式。比如『数据库技术内幕』一书组件插图是这样的:
所以不用太关注我们是怎样组织这些组成部分或者太关注处理流程怎样命名,因为我们做了一些取舍以适合这篇文章的编写。你需要重点关注的是这些不同的组成部分。
总体理解就是将数据库可以划分成多个相互交互组件。
核心组件
-
流程管理器:多数数据库都有一个需要管理的「池」,用来组织流程、线程等。甚至,为了取得纳秒级等极致性能,一些现代的数据库会使用其自己的线程,而不再是基于操作系统的线程。
-
网络管理器:网络的 I/O 一直是很重要的部分,特别是对分布式数据库来说。这也是为什么一些数据库实现自己的网络管理器的原因。
-
文件系统管理器:数据库遇到第一个瓶颈是磁盘 I/O。有一个能够完美处理操作系统文件系统甚至替换它的文件系统管理器相当重要。
-
内存管理器:为了避免磁盘I/O带来的影响,需要大量的内存。但是当你需要管理大量的内存的时候,就会需要一个高效的内存管理器。特别是你有多个查询同时在用内存查询的时候。
-
安全管理器:用于管理用户的身份验证和授权
-
客户端管理器:用于管理客户端的连接
工具
-
备份管理器:用来备份和还原数据库
-
恢复管理器:用来在数据库崩溃之后,以一致的状态来重新启动数据库
-
监控管理器:用来记录数据库的活动日志并提供监控数据
-
「管理」管理器:提供工具来管理数据库、表空间、模式,并管理像表的名称、结构等数据库的元数据
查询管理器
-
查询解析器:检查查询是否合法,像SQL语句有没有词法、语法错误这种
-
查询重写器:预优化查询
-
查询优化器:优化查询,让查询可以更高效的执行
-
查询执行器:编译和执行查询
数据管理器
-
事务管理器:处理事务
-
缓存管理器:和我们常用缓存一样理解,在使用前先把他们放到内存,在数据写到磁盘前也放到内存
-
数据访问管理器:访问磁盘上的数据
后面的文章,我们会重点描述数据库内是怎样通过以下这些流程来管理和进行SQL的查询的:
-
客户端管理器
-
查询管理器
-
数据管理器
英文链接:http://coding-geek.com/how-databases-work
- 【面试必备】用了那么多次 ping,是时候知道 ping 是如何工作的了!
- 数据库移植工作——建库脚本移植
- Ubuntu下有关Java和数据库的一些工作记录(二)
- 这些工作总结的误区,你都知道吗?
- Oracle 数据库 升级前 必要的准备工作
- 写在开头:你为什么需要知道原理与解析准备工作
- 工作了才知道
- 工作记录(四) MAVEN项目使用JDBC连接GP数据库(greenplum)
- 想从事DBA工作,该挑选哪一款数据库产品
- 应用程序和数据库服务器如何协同工作
- 触发器(八、用SERVERERROR触发器开展数据库错误维护工作)
- 工作记录:RCNN在自己的数据库上finetune之后进行测试
- 使用JDBC对数据库进行查询的前期准备工作,以及简单的JDBC访问MySQL数据库(Mac)
- 除了不要 SELECT * ,使用数据库还应知道的11个技巧!
- 35个非主流开源数据库 你知道吗?
- 工作了才知道
- 【脚本语言系列】关于 JavaScript 数据库, 你需要知道的事
- 做软件项目,只要知道计算机编程语言就可以做开发的工作了吗?
- 1.说说你个人理解的存储解决方案的发展趋势,作图描述。 11.png 2.画一张说明ASM实例同数据库实例协同工作的原理图,并给出语言描述。 14.png 一个监听器可以为多个实例
- 【连载】关系型数据库是如何工作的?(7) - 数据库架构视图