如何设计关系型数据库

RDBMS

从 0 到 1 设计关系型数据库,总共分为两个部分:

  • 程序实例

    • 存储管理模块
    • 缓存模块(需要设计淘汰机制
    • SQL 解析
    • 日志管理(记录所有操作)
    • 权限划分(授权模块)
    • 容灾机制(保证数据库高可用)
    • 索引管理(保证数据查询执行效率)
    • 锁管理(保证数据 ACID)
  • 存储模块

    • 文件系统(保证数据持久化)

索引模块

为什么使用索引

  1. 快速查询数据,避免全表扫描,提升检索效率

什么样的信息可以成为索引

  1. 主键和唯一键可以作为索引

索引的数据结构

  1. 生成索引,建立二叉查找树进行二分查找
  2. 生成索引,建立 B-Tr ee 结构进行查找
    1. 根结点至少包含两个孩子、终端节点位于同一层、树中每个节点最多含有 m 个孩子(m >+ 2)、除了根节点和叶节点外,其他每个节点至少有 ceil(m/2) 个孩子)通过合并、分裂来保持结构,层数不会变深
  3. 生成索引,建立 B+- Tree 进行查找
    1. 非叶子节点关键字和指针个数一样
    2. 非叶子节点的子数指针 P[i],指向关键字值[K[i], K[i+1]] 的子树
    3. 非叶子节点仅用来索引,数据都保存在叶子节点中
    4. 所有叶子节点均有一个链指针指向下一个叶子节点(方便统计和查询)
    5. 优点
      1. 磁盘读写代价更低
      2. 查询效率更加稳定 logn
      3. 有利于对数据库的扫描
  4. 生成索引,建立 Hash 结构进行查找
    1. 无法避免全表扫描
    2. 只能做 ‘=’ ‘in’ 等操作,无法做范围查询(hash 之后无法保证值的大小)
    3. 无法用于排序操作
    4. 不能利用部分索引键做查询
    5. hash 值重复率较高的情况下,效率没有 B Tree 效率高(不稳定)
  5. bitMap (位图)
    1. 只有几种值的时候(男,女),纯 CPU 叠加操作
    2. 缺点,锁的粒度大,不适用高并发的系统,适合统计较多的系统

密集索引和稀疏索引的区别

  1. 密集索引的文件中每个搜索码值都对应一个索引值
  2. 稀疏索引文件只为索引码的某些值建立索引项

InnoDB

  1. 若一个索引被定义,则这个索引被定义为密集索引
  2. 若没有索引被定义,该表的第一个唯一非空索引则作为密集索引
  3. 若不满足上述条件,内部会自己生成一个隐藏主键