前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >理解数据库:从文件系统到数据库

理解数据库:从文件系统到数据库

作者头像
明月AI
发布于 2021-10-28 07:27:53
发布于 2021-10-28 07:27:53
1.3K0
举报
文章被收录于专栏:野生AI架构师野生AI架构师

1. 缘起


对于数据库,可能很多数据分析师或者算法工程师都认识不深,但是他们的日常工作又经常用到,所以想起了写一个关于数据库主题的文章。准备从大家都非常熟悉的文件系统出发,来介绍数据库系统的各种基础概念。

2. 关于文件系统


无论大家使用的windows,还是mac,对文件系统应该都是比较熟悉的,因为我们日常的各种文件都保存在文件系统中。在文件系统中,有两个最基础的概念,一个是目录,一个是文件,每个目录下都可以创建目录,或者保存文件,这就是文件系统最基本的操作,大家每天都会用到。我们在网络上下载的文件,或者别人传给你的文件,你随手就会保存到某个目录下,通常这也不是随机保存的,而是有一定的规律性,方便自己以后还能找到。

当然,在Linux系统上,目录也是一种特殊的文件。

3. 如果要保存一个表格,应该怎么做


可能你会觉得奇怪,保存表格,不是直接将excel文件保存到某个目录下就可以了吗?这样说也对,从某种意义上说,excel就是一种数据库,虽然它很简单。我们excel文件都保存到一个目录(我们定义该目录为数据库的根目录,事实上数据库的数据就是保存到某个数据目录下的)下,那我们就可以理解是一个简单的数据库了。

但是随着日子的增长,我们就可以引入的概念,所谓库,其实就是目录。操作上,就是我们的excel文件不再是直接保存到根目录下了,而是保存在根目录的某个子目录下,而这个子目录就是我们所谓的。至于这个库的意义是什么,这就是使用者定义的了,不同类型的数据就能很好的组织起来。

为了规范,我们定义每个excel文件就是一个,也就是每个文件只有一个表格,而且这个表格也应该是比较规范的,例如每列是一个字段,每个字段都有一个名字,即字段名(即列名,或者说表头),每个字段保存的值的类型(就是所谓的字段类型)也是可以定义的,例如文本类型,整数类型等。

这样,从库到表,到字段,到字段类型,都有所规范了,我们这个数据库就有点样子了。可能你会觉得,这有点儿戏吧,但是事实上,真实数据库和这个并不是有本质的区别,他们的数据都是以某种规范保存到文件系统上,所以说数据库其实并没有那么神秘。

4. 这个数据库怎么进行数据搜索?


可能你会说,搜索和查询都没有,这算哪门子的数据库!这真的没有搜索和查询吗?

其实并不是,因为excel本身就能搜索和查询,虽然功能比较弱。需要说明一点的是,并不是使用sql语句的才叫查询,说白了,sql只不过是一种查询与操作的标准,和我们excel中的操作并没有本质的区别。

当然,区别还是有的,而且还不小。那就是excel中并没有索引,索引在excel中查询真的很慢很慢。。。

5. 那怎么能实现快速查询?


要实现快速查询,没有索引是不行的,重要到我们的索引大人登场了,这几乎是数据库最重要的概念,甚至没有之一。平时我们使用数据库,无论是MySQL,还是Oracle,好像都只是在字段上设置一下就ok了,但是这个设置操作对于数据库意味着什么,可能很多分析师都没什么概念,可能不少工程师也没有。所以,一谈到数据库查询优化,就一脸懵,好像这就是什么高深的黑魔法一样。

现在我们来给我们刚刚定义的数据库增加索引的功能,首先我们假设存在一张这样的成绩(这个也可以称为数据文件):

ID

name

score

1

张三

83

2

李四

73

3

王五

90

三生万物,我们就假装这个表格的数据是很多的,在excel查询很麻烦。

现在假设我们要找到班里的第一名,那该怎么办呢?那还不简单,直接在excel打开,点击字段排序就可以了。不过这个和我们的前提是冲突的,我们的前提是说这个表很大,在excel直接排序会卡死。

那索引怎么建呢?首先,建一个索引文件(没错,索引本身也是一个文件,只是在不同的数据库中,不一定是单独一个文件,但是不管什么形式,索引都是需要占用空间的,所以并不是多多益善),在这个文件里,直接score字段排好序:

ID

score

3

90

1

83

2

73

具体操作步骤就是:

  1. 首先,在索引文件里查到最高分的是ID为3的同学;
  2. 然后,回到数据文件直接找到ID为3的同学就可以了。

如果我们要查询成绩等于73的都有哪些同学呢?那简单,我直接在索引文件里,从上面一直往下看就是了。可以是可以,但这是最笨的方法了,从计算机的角度,要对前面的成绩每个都要做一次比较运算。

这当然有更加高效的方式来实现,这就要说到我们的算法了。为了高效,我们要充分利用索引文件数据本身已经排好序的特性,那就有非常高效的算法可以实现,例如二分法。我们不是傻傻的直接从前面一个个比较下来,而是先和中间的比较,先确定我们要找的值是在前面一段,还是后面一段。

每次二分的话,显然会比一个个比较快很多很多,试想一下,假设表格有一千万的记录,如果二分比较的话,最多多少次就能找到最终的数据呢?

刚才我们说的是的索引字段是数值型的,如果是文本型的呢,例如对name字段怎么建索引?事实上,对于计算机而言,整数和文本并没有本质的区别,保存到最后都是二进制的0和1,文本本身也是可以比较大小的,可以比较大小就能进行排序。

当然数据库本身用到的算法比我们这个二分法要复杂很多,通常是B+树及其变体,就是效率上的优化。

6. 有了索引之后,插入数据怎么办呢

数据文件更新之后,自然是需要同步更新索引文件的,数据库系统本身就是要保证这个同步的过程。显然,索引建的越多,不止空间消耗的越多,修改数据(包括增加,删除和修改)的效率都会受到影响。

索引并不是人畜无害的,建索引要三思。

7. 所谓列式数据库又是怎么回事


前面我们说的,都可以理解成属于行式数据库的范畴,就是按一行一行保存数据的。这种数据适合保存各种关系数据,适合各种业务数据,不过这也有缺点,那就是对分析不是太友好,当表数据很多时,可能就很难做分析。而列式数据库,恰好非常适合做分析。

所谓列式数据库,我们我们来定义的话,可以这样理解:前面关系数据库时,每个库目录下存放数据表文件,而到了列式数据库,我们的表这层也定义成目录,而每列的数据单独保存成文件,这样如果对该列进行分析时,那基本只需要加载对应的列文件即可。

8. 小结


对于数据库,除了行式和列式,还有很多的类型,例如图数据库,文档数据库,搜索数据库等等,适用于不同的场景,但是其实本质都是类似的。所有数据库,无论是数据还是索引,最终都是以文件的形式保存到文件系统中,只是其数据库系统本身保证了保存时的某种规范。

说明:现在也有些数据库,是直接将数据保存到内存中的(内存的读写速度那比硬盘快了很多很多),只是在持久化时保存到硬盘上,为的就是更加高效。

-----------------------------------------

下图与主题无关,只是刚好看到:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 野生AI架构师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 缘起
    • 3. 如果要保存一个表格,应该怎么做
    • 4. 这个数据库怎么进行数据搜索?
    • 5. 那怎么能实现快速查询?
    • 6. 有了索引之后,插入数据怎么办呢
    • 7. 所谓列式数据库又是怎么回事
    • 8. 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档