V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zxCoder
V2EX  ›  问与答

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

  •  
  •   zxCoder · 2020-04-05 10:07:27 +08:00 · 2378 次点击
    这是一个创建于 1728 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    8 条回复    2020-04-08 12:51:33 +08:00
    leonme
        1
    leonme  
       2020-04-05 10:20:34 +08:00   ❤️ 3
    ljpCN
        2
    ljpCN  
       2020-04-05 10:26:47 +08:00 via Android
    数据库原理的教科书来一本。以及数据库的论文。
    cmdOptionKana
        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 就是采用这种方式。
    vindurriel
        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+树
    movieatravelove
        5
    movieatravelove  
       2020-04-05 11:31:17 +08:00 via Android
    掘金小册里有一本讲 MySQL 的,我感觉讲的挺好,基本把 MySQL 系统讲了一遍。了解了底层 b+树的结构,你就知道为啥好多查询语句不走索引了。
    niubee1
        6
    niubee1  
       2020-04-05 12:13:38 +08:00
    你先理解什么是 排序,排序算法和数据结构之间的关系
    zxCoder
        7
    zxCoder  
    OP
       2020-04-08 09:07:56 +08:00
    @vindurriel 数据库启动,这个 hash 表就加载到内存了吗
    vindurriel
        8
    vindurriel  
       2020-04-08 12:51:33 +08:00 via iPhone
    @zxCoder 最近被访问的部分才会加到内存 都放内存放不下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2188 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 01:34 · PVG 09:34 · LAX 17:34 · JFK 20:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.