如何设计一个数据库结构
一个完整的数据库结构分为存储是程序实例俩部分;分别如下
- 程序实例
- 存储管理
- 缓存管理
- SQL解析
- 日志管理
- 权限划分
- 容灾管理
- 索引管理
- 锁管理
- 存储
- 文件系统
索引管理
常见的建立索引的数据结构有如下四种
- 生成索引,建立二叉查找数进行二叉查找
- 生成索引,建立B-Tree进行查找
- 生成索引,建立B±Tree进行查找
- 生成索引,建立BitMap结构进行查找
B-Tree的定义
该定义为5部分组成,定义如下:
- 根节点至少有俩个孩子
- 树中每个节点最多含有m个孩子(m>=2)
- 除根节点与叶子节点以外,其他每个节点至少有ceil(m/2)个孩子
- 所有叶子节点均位于同一层
- 假设每个非终端节点中包含n个关键字信息
- Ki(1…n)为关键字,Ki-1<ki
- 关键字的个数[ceil(m/2)-1] <= n <= m-1
- 非叶子节点的指针:p[1],p[2],…,p[m];其中p[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[m-1]的子树,P[i]指向关键字 >= K[i-1] 的子树 与<= k[i+1]的子树
B-Tree的数据结构如下图所示
举例查找15的节点
- 1.从根节点开始找起,15小于根节点关键字17,则位于P1指针指向的子树
- 2.15大于关键字12,则应该继续在P3的子树下查找
- 3.从左到右依次查找就找到了15
B±Tree的定义
B±Tree是B树的变体,其定义基本与B树相同,除了
- 非叶子节点的指针与关键字个数一致
- 非叶子节点的子树指针P[i],指向关键字[k[i],K[i+1])的子树
- 非叶子节点仅用来保存索引,所以的数据都保存在叶子节点中
- 所有叶子节点都有一个链指针指向下一个叶子节点
B±Tree的结构图如下:
结论 - B+树更适合用来存储索引
- B+树的磁盘读写代价更低
- B+树的查询效率更高
- B+树更有利于对数据库表进行扫描
Hash索引可以考虑一下
该索引的查询过程时,现将要查询的关键字进行hash运算,根据得到的hash值作为key值,在从hash索引中取出该bucket对应的链表,然后再进行遍历链表获取所有的全部数据
缺点
- 仅仅能满足"=","IN"不能使用范围查询,因为关键字hash运算的值只能做=过滤,故不能做范围查询
- 无法被用来避免数据的排序操作,因为hash运算的key值不一定是根据关键字的排列顺序是一致的,故不能避免排序
- 不能利用部分索引键查询,联合索引,可以根据最左匹配原则执行索引,但是hash索引是将关联字段的值一起进行hash运算的结果,所以不能进行利用部分索引键进行查询
- 不能避免表扫描
密集索引与稀疏索引的区别
- 密集索引的文件中的每个搜索码都对应一个索引值
- 稀疏索引文件只为索引码的某些值建立索引项
对于MySql数据引擎InnoDb
- 若有一个主键被定义,该主键则作为密集索引
- 若没有定义主键,则该表第一个唯一非空索引则作为密集索引
- 若不满足以上条件,innodb内部会生成一个隐藏主键(密集索引)
- 非主键索引存储相关键位和其对应的主键值,包含俩次查找
Myql中Innodb与MyISAM俩种存储引擎的索引结构
第一种Innodb的辅助索引为存储的是主键值,走辅助键索引则会先查询出对应的主键值,然后再根据该主键查询叶子节点上的相关数据,Innodb的引擎的数据存放由表结构文件、索引与数据文件俩部分组成
第二种MyISAM的主键索引与辅助键索引均在存储结构中存储一个数据指针,指向真实的数据位置,对于表而言,该存储引擎的主键索引与辅助键索引是没有关系的,在实际结构中MYISAM的索引文件与数据文件也是分开存放的,还包扣一个表结构文件,总共三个文件组成
关于索引的一些问题
为什么要使用索引?
使用索引可以避免在检索数据的时候进行全表扫描,加快检索效率
什么样的信息可以成为索引?
主键、唯一键,只要是可以让数据可以有区分的字段
索引的数据结构?
常见的数据结构为B+树,还有bitmap、hash、二叉查找树等,mysql不支持bitmap,mysql执行引擎为Innodb与MyISAM不支持hash
聚集索引与稀疏索引的区别?
密集索引的定义:叶子节点保存的不只是键值,还保存了位于同一行记录里的其他列的信息,由于密集索引决定了表的物理排列顺序,一个表只有一个物理排列顺序,所以一个表只能创建一个密集索引
稀疏索引:叶子节点仅保存了键位信息以及该行数据的地址