对于数据库,可能很多数据分析师或者算法工程师都认识不深,但是他们的日常工作又经常用到,所以想起了写一个关于数据库主题的文章。准备从大家都非常熟悉的文件系统出发,来介绍数据库系统的各种基础概念。
2. 关于文件系统
无论大家使用的windows,还是mac,对文件系统应该都是比较熟悉的,因为我们日常的各种文件都保存在文件系统中。在文件系统中,有两个最基础的概念,一个是目录,一个是文件,每个目录下都可以创建目录,或者保存文件,这就是文件系统最基本的操作,大家每天都会用到。我们在网络上下载的文件,或者别人传给你的文件,你随手就会保存到某个目录下,通常这也不是随机保存的,而是有一定的规律性,方便自己以后还能找到。
当然,在Linux系统上,目录也是一种特殊的文件。
可能你会觉得奇怪,保存表格,不是直接将excel文件保存到某个目录下就可以了吗?这样说也对,从某种意义上说,excel就是一种数据库,虽然它很简单。我们excel文件都保存到一个目录(我们定义该目录为数据库的根目录,事实上数据库的数据就是保存到某个数据目录下的)下,那我们就可以理解是一个简单的数据库了。
但是随着日子的增长,我们就可以引入库的概念,所谓库,其实就是目录。操作上,就是我们的excel文件不再是直接保存到根目录下了,而是保存在根目录的某个子目录下,而这个子目录就是我们所谓的库。至于这个库的意义是什么,这就是使用者定义的了,不同类型的数据就能很好的组织起来。
为了规范,我们定义每个excel文件就是一个表,也就是每个文件只有一个表格,而且这个表格也应该是比较规范的,例如每列是一个字段,每个字段都有一个名字,即字段名(即列名,或者说表头),每个字段保存的值的类型(就是所谓的字段类型)也是可以定义的,例如文本类型,整数类型等。
这样,从库到表,到字段,到字段类型,都有所规范了,我们这个数据库就有点样子了。可能你会觉得,这有点儿戏吧,但是事实上,真实数据库和这个并不是有本质的区别,他们的数据都是以某种规范保存到文件系统上,所以说数据库其实并没有那么神秘。
可能你会说,搜索和查询都没有,这算哪门子的数据库!这真的没有搜索和查询吗?
其实并不是,因为excel本身就能搜索和查询,虽然功能比较弱。需要说明一点的是,并不是使用sql语句的才叫查询,说白了,sql只不过是一种查询与操作的标准,和我们excel中的操作并没有本质的区别。
当然,区别还是有的,而且还不小。那就是excel中并没有索引,索引在excel中查询真的很慢很慢。。。
要实现快速查询,没有索引是不行的,重要到我们的索引大人登场了,这几乎是数据库最重要的概念,甚至没有之一。平时我们使用数据库,无论是MySQL,还是Oracle,好像都只是在字段上设置一下就ok了,但是这个设置操作对于数据库意味着什么,可能很多分析师都没什么概念,可能不少工程师也没有。所以,一谈到数据库查询优化,就一脸懵,好像这就是什么高深的黑魔法一样。
现在我们来给我们刚刚定义的数据库增加索引的功能,首先我们假设存在一张这样的成绩(这个也可以称为数据文件):
ID | name | score |
---|---|---|
1 | 张三 | 83 |
2 | 李四 | 73 |
3 | 王五 | 90 |
三生万物,我们就假装这个表格的数据是很多的,在excel查询很麻烦。
现在假设我们要找到班里的第一名,那该怎么办呢?那还不简单,直接在excel打开,点击字段排序就可以了。不过这个和我们的前提是冲突的,我们的前提是说这个表很大,在excel直接排序会卡死。
那索引怎么建呢?首先,建一个索引文件(没错,索引本身也是一个文件,只是在不同的数据库中,不一定是单独一个文件,但是不管什么形式,索引都是需要占用空间的,所以并不是多多益善),在这个文件里,直接score字段排好序:
ID | score |
---|---|
3 | 90 |
1 | 83 |
2 | 73 |
具体操作步骤就是:
如果我们要查询成绩等于73的都有哪些同学呢?那简单,我直接在索引文件里,从上面一直往下看就是了。可以是可以,但这是最笨的方法了,从计算机的角度,要对前面的成绩每个都要做一次比较运算。
这当然有更加高效的方式来实现,这就要说到我们的算法了。为了高效,我们要充分利用索引文件数据本身已经排好序的特性,那就有非常高效的算法可以实现,例如二分法。我们不是傻傻的直接从前面一个个比较下来,而是先和中间的比较,先确定我们要找的值是在前面一段,还是后面一段。
每次二分的话,显然会比一个个比较快很多很多,试想一下,假设表格有一千万的记录,如果二分比较的话,最多多少次就能找到最终的数据呢?
刚才我们说的是的索引字段是数值型的,如果是文本型的呢,例如对name字段怎么建索引?事实上,对于计算机而言,整数和文本并没有本质的区别,保存到最后都是二进制的0和1,文本本身也是可以比较大小的,可以比较大小就能进行排序。
当然数据库本身用到的算法比我们这个二分法要复杂很多,通常是B+树及其变体,就是效率上的优化。
数据文件更新之后,自然是需要同步更新索引文件的,数据库系统本身就是要保证这个同步的过程。显然,索引建的越多,不止空间消耗的越多,修改数据(包括增加,删除和修改)的效率都会受到影响。
索引并不是人畜无害的,建索引要三思。
前面我们说的,都可以理解成属于行式数据库的范畴,就是按一行一行保存数据的。这种数据适合保存各种关系数据,适合各种业务数据,不过这也有缺点,那就是对分析不是太友好,当表数据很多时,可能就很难做分析。而列式数据库,恰好非常适合做分析。
所谓列式数据库,我们我们来定义的话,可以这样理解:前面关系数据库时,每个库目录下存放数据表文件,而到了列式数据库,我们的表这层也定义成目录,而每列的数据单独保存成文件,这样如果对该列进行分析时,那基本只需要加载对应的列文件即可。
对于数据库,除了行式和列式,还有很多的类型,例如图数据库,文档数据库,搜索数据库等等,适用于不同的场景,但是其实本质都是类似的。所有数据库,无论是数据还是索引,最终都是以文件的形式保存到文件系统中,只是其数据库系统本身保证了保存时的某种规范。
说明:现在也有些数据库,是直接将数据保存到内存中的(内存的读写速度那比硬盘快了很多很多),只是在持久化时保存到硬盘上,为的就是更加高效。
-----------------------------------------
下图与主题无关,只是刚好看到:
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有