数据库基础总结

如何设计一个数据库结构

一个完整的数据库结构分为存储是程序实例俩部分;分别如下
  • 程序实例
    • 存储管理
    • 缓存管理
    • 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
聚集索引与稀疏索引的区别?
密集索引的定义:叶子节点保存的不只是键值,还保存了位于同一行记录里的其他列的信息,由于密集索引决定了表的物理排列顺序,一个表只有一个物理排列顺序,所以一个表只能创建一个密集索引

稀疏索引:叶子节点仅保存了键位信息以及该行数据的地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值