数据库内核讲解-(二)一起来搭一个数据库系统的架构吧!
有
要建一栋大楼,首先肯定是需要一张详细,漂亮的设计图,一个系统的建立同样也需要一个蓝图,如果蒙头直接干,想到啥做啥,那这个系统到后面就会崩溃,其实这也是架构师存在的意义之一。 有一天,在搬砖的时候,突然,你对自己说:“不行,我不能整天做增删改查,我是要成为程序媛的男人,就让我自己做一个数据库让别人增删改查吧!” 说做就做,你跑到某宝上买了一大块硬盘,接上电脑,放在了自己的房间里,:“这就是我实现数据库的仓库了!” 然后,你想着要做一个数据库,自己肯定要先画一个数据库的蓝图(架构图)吧! 我们先有点仪式感,给我们要绘画的架构蓝图文件起个名字,就叫dggz(大哥关注)吧! 那有了自己的硬盘,然后第一步,在dggz上画一个数据仓库。 有了数据仓库,接下来你就考虑一个问题,数据仓库需要一个磁盘管理器来存取文件吧,于是乎你就萌生了三个解决方案, 1.使用目前操作系统提供的文件系统来作为自己数据仓库的磁盘管理器。 2.自己写一个磁盘管理器? 3.在现有的文件系统上加以改造,使这个磁盘管理器适合自己的数据仓库。 数据库经常要做的是拿里面得数据元组出来做事,很明显现有得文件系统以文件为单位并不显得那么合适,那是否可以考虑自己写一个磁盘管理器?很明显,如果能自己写一个磁盘管理器是最适合咱们数据仓库的方案了,但是成本过高,时间成本和人力成本都太高mysql内核,那只有第三种折中的方案了,在现有的文件系统上加以改造,使它适应我们自己的数据仓库了。 说干就干,咱要使现有的文件系统适应咱自己的仓库,那咱自己的仓库就要有一些问题需要解决。 1.数据项怎么表示呢,就是 姓名,年龄这些数据在仓库里用varchar和interger 都用bytes表示,但怎么表示这个问题需要我们自己考虑。 2.记录怎么表示,就是数据项的集合,比如说 姓名年龄是user表的模式,那么一条记录就是 (小明,18),这条记录在文件中要怎么表示。 3.每次把数据读入内存,不大可能一次一条的读,那每次肯定读入一个块为单位会更合适,那么记录在块中怎么组织比较合适呢? 4.记录怎么修改呢?比如说修改后记录超出块的范围等等问题? 5.块要怎么在文件中表示呢? 终于,历经千辛万苦,咱们解决了以上的问题,对现有的 文件系统完成了改造。可以在dggz上加上存储管理器了。 接下来,咱要考虑一下读取的效率问题了,数据的读取如果每次都是直接从磁盘读出来,那么咱这个数据库的效率肯定不会特别的高,所以咱在内存中肯定要设定一个缓冲区,用来交换数据,保存一些数据,让交换到磁盘里的次数减少,于是咱可以在dggz上上一块缓冲区。 有了这块缓冲区,肯定需要涉及到缓冲区的管理,考虑以下问题, 1.缓冲区的结构怎么设计? 2.缓冲区的置换算法怎么设计? 3.缓冲区的怎么管理,就是怎么从磁盘把数据置换到缓冲区? 解决完以上问题,咱们就可以在dggz上画一个缓冲区管理器了。 下一步呢?我们要从磁盘里读数据,但每次读数据总不能都全表扫描把,肯定需要一个索引,和文件的管理器吧,用来记录和管理索引。利用索引,文件,记录等信息,穿过缓冲区读取仓库里的文件。 有了对咱数据库操作的整套工具后,就要考虑对外的开放了,需要有SQL语句,那定义好咱们的SQL语句,就需要有一个查询的编译器。 此时,解析完这些语句,肯定需要一个执行这些语句的工具,执行引擎就出现了。 就这样,咱的一个简单的数据库就完成了,但是这样的数据库在软件设计上有诸多的不完善,无法商用,比如说如果数据出现丢失,咱们数据库有什么办法恢复吗?这个时候就需要一个日志和恢复的管理器吧。 有了日志,咱得考虑下一个事情,如果咱对数据库的操作,比如说银行转账,A往B的账户赚钱,A转了100万到B的账户,这个时候银行系统崩溃了,然后恢复,这个时候B的账户还没有转进100万,于是乎发生了官司,怎么办,咱们肯定不会允许这个事情发生,所以咱就考虑把A账户减100万和B账户加100万绑定成一组操作,要么都做,要么都不做,我们称这个东西叫事务,这样才能保证我们数据库的正确性和安全性,于是乎,咱就往数据库里添加了一个事务管理器。当然,事务需要记录在日志中才安全。 这个时候数据库的安全性和正确性得到了满足,但是数据库是同时很多人在用的,现在咱们完成的只是单人的使用,如果多个人一起使用,还是会发生比如两个同时访问一个数据,一个读一个写,就会有不正确的事发生,所以要加上并发控制,当然,并发控制目前主流的还是用锁,所以我们需要一个锁表。 嗯嗯,做系统的都知道,需要管理员,那就来一个数据库管理员吧。 然后一个完整的数据库系统就新鲜出炉啦! 你满意的看了看自己的砖,搬得更加卖力了。 挖了这么多的坑,下一章终于要开始填坑了!下一章先讲讲存储器吧! 最后,还是那句话,大哥姐姐们,码字不易,来点赞吧,有打赏我也不介意嘿嘿。 (编辑:海南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |