作为一个天天都在CRUD的程序员 , 你有没有想过 , 数据库是如何工作的?
我猜 , 你曾经无数次的翻开讲数据库的书籍和文章 , 但总是看着看着就被劝退 , 太多的专业术语把人头都搞大了 。
等等 , 看这画风 , 今天是要卖课的节奏啊!
NO!绝不卖课 , 请放心阅读 。
一直以来 , 我都很想深入学习一下数据库 。我这个人学东西 , 如果只知其然而不知其所以然是非常难受的 , 啥都想去了解下背后的原理 , 学编程语言是这样 , 学操作系统也是这样 。数据库这个东西天天都在用 , 所以学习一下背后的原理也是非常实用和有必要的 。
但无论是哪本书、哪个视频教程 , 一打开就被无数的专业术语淹没 , 太多概念淹没了数据库最本质最核心的东西 。
所以今天 , 让我们从一个最最最简单的模型开始 , 揭开数据库神秘的一角 。
对我们使用者而言 , 数据库就像是一个黑盒子 , 你可以往它里面写入数据 , 也可以从它里面读出数据 。

文章插图
让我们暂时抛却SQL、网络连接、数据库等等概念 , 就来看这个最基本的需求:如果我们来实现一个可以对外提供读写数据的黑盒子 , 该怎么做?
假设我们的黑盒子很简单 , 里面只有一张表:user_info , 用来存储用户信息 。
表里面也很简单 , 只有三个字段 , 分别记录用户的ID、姓名和手机号 。
user_id(uint32)name(char[8])phone(char[20])我们可以用一个简单的结构体(或者一个class)来表示一条数据:struct DataRecord{uint32 user_id;char name[8];char phone[20];};user_id是一个uint32类型 , 占4个字节 , name占8个字节 , phone占20个字节 , 加起来一条数据总共占32个字节 。我们选择用一个文件来存储这些数据 , 存储非常简单 , 只需要一条一条的码在一起就行了 , 就像这样:

文章插图
数据存储方式有了 , 接下来就是如何来读写了 , 我们来提供两个函数 , 分别来插入(insert)和查询(select)数据:
// 伪代码void insert(Table* table, DataRecord record) {fp = open(table->file_name);fseek(fp, FILE_END);write(fp, sizeof(DataRecord));close(fp);}插入很简单 , 直接打开表对应的数据文件 , 然后把文件指针移动到文件尾部 , 接着追加数据 , 最后关闭文件 , 大功告成 。这和把大象关进冰箱的步骤是一样一样的 。接下来是查询 , 我们提供一个可以通过id来查询用户的函数:
// 伪代码DataRecord select(uint32 user_id) {DataRecord result;fp = open(table->file_name);while (1) {if (feof(fp))break;DataRecord record;read(fp, &record, sizeof(DataRecord));if (record.user_id == user_id) {result = record;break;}}close(fp);return result;}查询也很简单 , 我们打开文件 , 一条一条读取数据 , 然后比较用户id和给定的参数是否相同 , 直到找到符合条件的数据返回 。好了 , 以上 , 我们就实现了一个最最最基础的黑盒子:它里面有一张表 , 然后可以往里面写数据 , 从里面查数据 。
现在来思考一下:
如果我们写了很多数据进去 , 比如几十万条 , 我们要查一个指定id的数据 , 要按照这样一条条比对 , 那不得等到猴年马月去了?
为什么要一条条比对呢?是因为我们的数据全都是一条一条码在一起的 , 完全没有顺序 , 所以要查询 , 只能这样一条条检查——全表扫描 。
如果我们的数据是有顺序的呢?
假如我们插入数据的时候 , 是按照id从小到大排列着 , 这样我们就能用二分法快速找到指定id的数据了 。

文章插图
看上面这张图 , 假设我们要查找id为9的数据 , 我们可以读取第一条数据的id是1 , 就知道id为9的数据肯定在它后面 。然后再读取最后一条数据id是12 , 就知道id为9的数据肯定在它前面 , 然后选择中间的数据读取 , 如此二分查找 , 很快就能锁定目标 , 不用每条数据都读取了 。
推荐阅读
- 如何选择适合自己的掌上游戏机
- 华晨宇|明明自己没实力,还敢上台当导师、教人演戏,这些“老师”太尴尬
- 豆瓣|新剧推荐|上线三天,豆瓣榜单第一的台剧,为何如此受欢迎?
- |稀奇!世界上的这18种稀奇古怪的职业之终结篇
- 底妆|抄袭上瘾的“国货之光”,一半人骂无耻,一半人说真香
- 晚上明明困却总是睡不着是什么原因,很困但是睡不着是什么原因-
- 杨紫|网传杨紫新剧《199爱》招商书曝光,播放平台不是酷,或双台上星
- 火车带酒规定2019 火车上可以带白酒吗?
- |职场沟通:适当提出困难,没有问题
- 生活上的事情是什么,生活中还有什么事-
