- 数据库的总体架构
| 存储管理 | 缓存机制 | sql解析 | 日志管理 |
| 权限划分 | 容灾机制 | 索引管理 | 锁机制 |
存储(文件系统) |
|||
-
索引
快速查找数据 避免全表扫描 -
可以建立索引的字段:
主键,唯一键等(可以把该记录限定在一定查找范围内的字段) -
索引的数据结构
- 二叉搜索树
- B树
- B+树
- Hash
-
二叉搜索树
左子树<根<右子树
缺点:可能出现线性,使io增大,降低查找效率 -
B树 (平衡多路查找树 )
- 要点:
- 所有节点的关键字升序
- 每个节点都存有关键字和关键字对应的数据
- 关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它
- 插入:
- 判断当前结点key的个数是否小于等于m-1,如果满足,直接插入即可,如果不满足,将节点的中间的key将这个节点分为左右两部分,中间的节点放到父节点中即可
- 删除(叶子节点的删除和非叶子节点的删除)
- 叶子节点删除:
- 直接删除
- 若小于m/2,就像兄弟节点借:将对应父节点移到删除的节点对应位置,将兄弟节点移至父节点对应位置。
- 若兄弟节点借不了,将父节点移至删除节点的对应位置,然后拼接兄弟节点
- 删除非叶子节点:
- 将后继子节点移至删除节点对应位置,然后类上删除叶子节点
- 叶子节点删除:
- 要点:
-
B+树
- 要点
- 类似于B树
- 非叶子节点不存储数据,数据全存在叶子节点上
- 叶子节点的关键字升序,左边结尾数据都会保存右边节点开始数据的指针
-
父节点存有右孩子的第一个元素的关键字
- 优点
- 有利于范围统计
- 可以进行遍历
- 插入
- 当节点元素数量大于m-1的时候,按中间元素分裂成左右两部分,中间元素分裂到父节点当做索引存储,但是,本身中间元素还是分裂右边这一部分的
- 删除
- 叶子节点有指针的存在,向兄弟节点借元素时,不需要通过父节点了,而是可以直接通过兄弟节移动即可(前提是兄弟节点的元素大于m/2),然后更新父节点的索引;如果兄弟节点的元素不大于m/2(兄弟节点也没有多余的元素),则将当前节点和兄弟节点合并,并且删除父节点中的key
- 要点
-
B树 和 B+树 比较
- 磁盘读写代价更低
- 查询效率更稳定
- 更有利于数据库的扫描
-
Hash
- 通过散列表存储
- 缺点:
- 仅能满足 ”=“ ”IN“ 不能使用范围查询(hash后,大小可能发生变化)
- 不能实现数据的排序操作
- 不能利用部分索引键查询
- 不能遍历表
- hash碰撞频率高后,性能会降低