RDBMS
从 0 到 1 设计关系型数据库,总共分为两个部分:
程序实例
- 存储管理模块
- 缓存模块(需要设计淘汰机制
- SQL 解析
- 日志管理(记录所有操作)
- 权限划分(授权模块)
- 容灾机制(保证数据库高可用)
- 索引管理(保证数据查询执行效率)
- 锁管理(保证数据 ACID)
存储模块
- 文件系统(保证数据持久化)
索引模块
为什么使用索引
- 快速查询数据,避免全表扫描,提升检索效率
什么样的信息可以成为索引
- 主键和唯一键可以作为索引
索引的数据结构
- 生成索引,建立二叉查找树进行二分查找
- 生成索引,建立 B-Tr ee 结构进行查找
- 根结点至少包含两个孩子、终端节点位于同一层、树中每个节点最多含有 m 个孩子(m >+ 2)、除了根节点和叶节点外,其他每个节点至少有 ceil(m/2) 个孩子)通过合并、分裂来保持结构,层数不会变深
- 生成索引,建立 B+- Tree 进行查找
- 非叶子节点关键字和指针个数一样
- 非叶子节点的子数指针 P[i],指向关键字值[K[i], K[i+1]] 的子树
- 非叶子节点仅用来索引,数据都保存在叶子节点中
- 所有叶子节点均有一个链指针指向下一个叶子节点(方便统计和查询)
- 优点
- 磁盘读写代价更低
- 查询效率更加稳定 logn
- 有利于对数据库的扫描
- 生成索引,建立 Hash 结构进行查找
- 无法避免全表扫描
- 只能做 ‘=’ ‘in’ 等操作,无法做范围查询(hash 之后无法保证值的大小)
- 无法用于排序操作
- 不能利用部分索引键做查询
- hash 值重复率较高的情况下,效率没有 B Tree 效率高(不稳定)
- bitMap (位图)
- 只有几种值的时候(男,女),纯 CPU 叠加操作
- 缺点,锁的粒度大,不适用高并发的系统,适合统计较多的系统
密集索引和稀疏索引的区别
- 密集索引的文件中每个搜索码值都对应一个索引值
- 稀疏索引文件只为索引码的某些值建立索引项
InnoDB
- 若一个索引被定义,则这个索引被定义为密集索引
- 若没有索引被定义,该表的第一个唯一非空索引则作为密集索引
- 若不满足上述条件,内部会自己生成一个隐藏主键