比如 hash 索引,hash 表我能理解,那在数据库中,我对这一列建 hash 索引,这列的每一个值都通过 hash 函数得到一个 hash 值作为 key,value 就是这一行的数据,这样对吗,然后具体是怎么关联起来的,这一行的数据应该是存在硬盘里的,每次要查询读取到内存,然后呢?
比如 B+树的索引,树的结构和一些查找插入删除操作我也学过了,但是还是很难和具体的数据库联系起来。
有没有书或者技术文章对这个有具体的解释呢,感觉学着学着就容易钻牛角尖出不来了。
1
leonme 2020-04-05 10:20:34 +08:00 3
|
2
ljpCN 2020-04-05 10:26:47 +08:00 via Android
数据库原理的教科书来一本。以及数据库的论文。
|
3
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 就是采用这种方式。 |
4
vindurriel 2020-04-05 10:57:35 +08:00 via iPhone
假定你说的数据库是 MySql 它的索引结构就是 B+树
hash 能理解的话 一般有两组 一组 key 是 column,value 是 primary key 另一组 key 是 primary key,value 是 row 如果数据多到内存放不下 就得把一个大的 hash 拆成多个 然后存盘 多个 hash 之间的拓扑结构就是 B+树 |
5
movieatravelove 2020-04-05 11:31:17 +08:00 via Android
掘金小册里有一本讲 MySQL 的,我感觉讲的挺好,基本把 MySQL 系统讲了一遍。了解了底层 b+树的结构,你就知道为啥好多查询语句不走索引了。
|
6
niubee1 2020-04-05 12:13:38 +08:00
你先理解什么是 排序,排序算法和数据结构之间的关系
|
7
zxCoder OP @vindurriel 数据库启动,这个 hash 表就加载到内存了吗
|
8
vindurriel 2020-04-08 12:51:33 +08:00 via iPhone
@zxCoder 最近被访问的部分才会加到内存 都放内存放不下
|