浅谈数据库
作者:
| 更新日期:看了阮一峰的《数据库的最简单实现》,原来自己想多了。
本文首发于公众号:天空的代码世界,微信号:tiankonguse
随便扯一些题外话
大学里,很多专业都学过数据库这们课程,但是这个课程只是教你怎么使用数据库。
上面也没有将数据库事实现原理,这让很多人摸不着头脑。
曾经我也很困惑,不就是用树来加快搜索嘛,从O(n) 的复杂度降到log(n)的复杂度。
但是我还是有几个问题没想出来。
- 这个树怎么储存的?直接一个节点一个文件吗?
- 有多个查询条件时怎么实现的?难道分开查询?
- NOSQL 数据库到底是什么意思?难道只是不同的节点的属性可能不同。
好吧,我看了阮一峰的《数据库的最简单实现》,想要说一些东西了。
看阮一峰的那篇文章学到的
记录等长
在关系型数据库中,一个很明显的特点就是每条记录都是等长的。
而且每个记录的字段完全相等,且对应的字段也是等长,字段的顺序也相同。
查询依靠什么
维基百科上是这样描述关系键的:
关系键是关系数据库的重要组成部分。
关系键是一个表中的一个或几个属性,用来标识该表的每一行或与另一个表产生联系。
说的很明确,我就不多说什么了。
关系键有主键(primary key), 超键(superkey), 候选键(candidate key),外键(foreign key),代理鍵,自然键。
我们只需要简单的理解有两个主键和外键。
假设我们只会查询主键,那么我们该选择什么样的数据结构才能加快查询呢?
参加过ACM的同胞应该马上可以想到树这个数据结构了。
最常见的是二叉查找树,查找复杂度O(log(n)),即二分查找。
有时候我们可能需要查询的条件不是主键怎么办?
数据库会先对查询的条件建一个索引。
对于索引,可以简单的理解为特殊的主键,或者把主键理解为特殊的索引。
主键的特殊之处是一个主键可以唯一标示一条记录。
建一个索引的意思就是以查询的条件(假设是单一条件)为比较值,建一个查找树,方便快速查找。
新建的这个树会缓存下来。
这也是为什么别人会告诉你,对经常查询的条件加上索引的缘故。
数据库用的什么树
数据库的实现没有简单的选择二叉查找树。
原因是我们每查一层,我们需要读取下层的数据,这个读取不是从内存里读取的,是从硬盘里读取的。
这样看来,我们至少需要读取硬盘的次数是O(log(n))次了,这样的代价是很大的,不可接受的。
说起从硬盘起读取数据,不知道大家有没有想起给磁盘文件排序的问题。
对,我们的数据库和磁盘文件排序面临着一样的问题,不能一次性把所有内容读取到内存中,需要多次读取。
这时要考虑的是读取数据的次数了,我们需要尽量减少读取数据的次数。
那我们该如何选取数据结构呢?
这是B树站出来了。
什么是B树呢?
可以理解为多叉查找树,而且每个节点储存多个值。
看看这个图片
这样,每个节点储存100个值,3层可以储存100W个值了,但是我们只需要读取3次硬盘,换成二叉查找树的话是20层左右,这效率是刚刚的。
聊些其他的
其实看了阮一峰的那篇文章,我有种被骗的感觉。
在那篇文章里学到的知识只有一个:数据库的数据结构为什么选择B树。
实际上数据库有三部分组成:存储管理器、查询处理器和事务管理器。
聊聊索引
直接说不好说,我们从侧面来说吧。
假设我们的数据有好多好多,几十亿条吧,我们要搜索一些数据来,那一般的想法是不是一个一个的查找呢?
上面提到过B树,但是B树的键值是主键,我们的搜索条件大多数不是主键,这是怎么快速搜索到我们想要的数据呢?
是不是对我们要搜索的条件建立索引就行了呢?
简单的说是的。
常见的索引有BTree索引,哈希索引,全文索引。
这里我们只简单的聊聊二叉树索引吧。
实际上是想展示一张图片,看了之后大概就可以明白索引工作的原理了。
看完这张图应该有很多想法了吧。
按建二叉树索引的方式,我们也可以建出B树索引了。
剩下的和主键查找类似了。
说了这么多,本文实际上只是提起算法的名字,而没有详细的讲解算法的具体原理以及怎么应用。
不过我也没有想将这些的想法,因为如果你是一个ACMER的话,不考虑效率等因素,这些你应该可以自己独立实现出来的(原理应该自己知道,实现即应用)。
最近我打算看老外写的一些数据库的书,这几本老外写的数据库书就是从这些原理上讲解的。
而我们学校的数据库课程,现在想想只是告诉你怎么使用数据库的,然后就没然后了。
好了,自己对数据库了解的也很少,不多说了,看书去了。
<完> 完>
本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。