数据库索引底层是什么原理

2020-04-05 10:07:27 +08:00
 zxCoder

比如 hash 索引,hash 表我能理解,那在数据库中,我对这一列建 hash 索引,这列的每一个值都通过 hash 函数得到一个 hash 值作为 key,value 就是这一行的数据,这样对吗,然后具体是怎么关联起来的,这一行的数据应该是存在硬盘里的,每次要查询读取到内存,然后呢?

比如 B+树的索引,树的结构和一些查找插入删除操作我也学过了,但是还是很难和具体的数据库联系起来。

有没有书或者技术文章对这个有具体的解释呢,感觉学着学着就容易钻牛角尖出不来了。

2378 次点击
所在节点    问与答
8 条回复
leonme
2020-04-05 10:20:34 +08:00
ljpCN
2020-04-05 10:26:47 +08:00
数据库原理的教科书来一本。以及数据库的论文。
cmdOptionKana
2020-04-05 10:51:21 +08:00
最近我做自己的小项目时,没有用通常的数据库,而是自己做了一个极简陋版的数据库(但能满足自己的需求) https://github.com/ahui2016/mima-go/blob/master/db/db.go

由于我的数据量很小,并且有加密需求,因此每次用户输入密码登入时,读取文件内容解密,全部读入内存。

有更新时,更新内存中的数据,同时在硬盘里写一个小文件(我称之为“数据库碎片),里面包含了操作逻辑。由于我这个是单用户系统,因此可以认为每个数据库操作都有先后顺序,不可能两个操作 “同时” 发生,因此不需要处理这种冲突。

在某个时间点,对一堆数据库碎片按时间顺序批量处理,更新主数据库(其实就是一个文件,一行一个 json )。

另外,如果需要考虑数据量较大的情况,简单的数据库可以采用这种做法:内存里只储存 key, 而把 value 保存到硬盘。比如这个 https://github.com/recoilme/pudge 就是采用这种方式。
vindurriel
2020-04-05 10:57:35 +08:00
假定你说的数据库是 MySql 它的索引结构就是 B+树
hash 能理解的话 一般有两组 一组 key 是 column,value 是 primary key 另一组 key 是 primary key,value 是 row
如果数据多到内存放不下 就得把一个大的 hash 拆成多个 然后存盘 多个 hash 之间的拓扑结构就是 B+树
movieatravelove
2020-04-05 11:31:17 +08:00
掘金小册里有一本讲 MySQL 的,我感觉讲的挺好,基本把 MySQL 系统讲了一遍。了解了底层 b+树的结构,你就知道为啥好多查询语句不走索引了。
niubee1
2020-04-05 12:13:38 +08:00
你先理解什么是 排序,排序算法和数据结构之间的关系
zxCoder
2020-04-08 09:07:56 +08:00
@vindurriel 数据库启动,这个 hash 表就加载到内存了吗
vindurriel
2020-04-08 12:51:33 +08:00
@zxCoder 最近被访问的部分才会加到内存 都放内存放不下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/659538

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX