0
点赞
收藏
分享

微信扫一扫

数据库——索引

一、索引

1、缓冲池、读取

  1. 缓冲池:基于硬盘的数据库系统一般都有缓冲池,即一块内存区域。对于缓冲池的维护一般采用最近最少(LRU)算法。 读取时,首先判断是否在缓冲池中,在的话直接读取缓冲池中的页。 写入时,数据库将页读入缓冲池,然后在缓冲池中对页进行修改,一般异步的写入磁盘中。
  2. 顺序读取与随机读取:顺序读取指顺序读取磁盘上的页。随机读取即读取磁盘页并不连续,需要磁头不停移动。(这里的顺序指的是逻辑顺序,物理上不一定连续)数据库一般根据区来管理页,在InnoDB存储引擎中一个区是连续的64个页。

2、B树与B+树

顺手把平衡二叉树和红黑树也记录下。

(1) 平衡二叉树操作:

  1. 左-左型:做右旋。左孩子做父节点,父节点做左孩子的右孩子。
  2. 右-右型:做左旋。右孩子做父节点,父节点做右孩子的左孩子。
  3. 左-右型:先把左孩子左旋,变成左-左型,再做右旋。
  4. 右-左型:先把右孩子右旋,变成右-右型,再做左旋。

数据库——索引_主键

红黑树 :即Java中的TreeMap,一种近似平衡的二叉查找树,相比平衡二叉树可以在修改时减少旋转次数。另外在jdk1.8后,HashMap用链表变红黑树来解决过多(默认是8)的Hash冲突。

  1. 根节点是黑色。
  2. 节点是红色或黑色。
  3. 每个红色节点的两个子节点都是黑色。(不能有两个连续的红色节点)
  4. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

这些约束有了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短路径的两倍长(假如根R到A叶子路径最长,到B叶子路径最短,最长不多于最短的两倍RA<=2RB),所以这个树大致上是平衡的。红黑树的插入情况比较多,变色旋转也很麻烦,用到了再看吧。

Github的一篇关于TreeMap的文章

(2) B树

是多路平衡查找树,并且每个节点不止一个关键字,通过一些规则来确保其平衡性与查找效率。

  • 子节点个数:非叶节点子节点数 1 < x <= M(M为阶数,代表一个树最多多少个查找路径,即为M叉树),且M >= 2,空树除外。
  • 关键字数:枝节点关键字数量 (M+1)/2-1(M/2向上取整后减一)<= y < M-1。(下限是为了保证其查找效率,上限是M路限制了关键字数)
  • 所有叶节点均在同一层,叶节点的子节点指针为null。(保证其平衡性)

数据库——索引_子节点_02

一个3阶的B树大概长这个样。在插入时候,关键字数 >= M-1 时需要拆分,把中间的字拆到父节点,然后原子节点分裂为两个。 删除时候如果枝节点关键字过少时候,先从子节点取,子节点没合适的就从父节点取,然后一直更新节点。

(3) B+树

对于B树进行了改进,层级更少了,切叶节点构成了有序列表。

  • B+树的非叶节点只进行索引不保存数据,每个非叶节点可以保存的关键字增加。
  • 只有到叶节点才能查到数据,查询次数稳定。
  • 叶节点连接成了链表,非常适合范围查询,查询到了一个边界然后直接遍历链表。

数据库——索引_主键_03


节点内容

节点

查找

B树

既存放 键(key) 也存放 数据(data)

叶子节点都是独立的

不稳定,相当于对范围内节点二分查找

B+树

叶子节点存放 key 和 data,其他内节点只存放 key,相当于其它节点作为索引

叶子节点有一条引用链指向与它相邻的叶子节点

稳定,从根节点到叶节点,叶节点再顺序查找

B树、B+、B*讲解推荐




(4) Hash索引与B+树索引

索引有点可以加快查询速度,缺点占用存储空间而且需要维护耗费资源。

  • Hash索引定位较快,但要考虑Hash冲突问题。最重要是不支持范围查询。
  • B+树索引对范围查询支持较好。

3、聚集索引与非聚集索引

聚集索引即索引结构和数据一起存放的索引。主键索引属于聚集索引。

  • 优点:速度快,本身B+就是多路平衡树,定位到索引节点就定位了数据。
  • 缺点:需要数据有序,数据较长或难以比较(字符串、UUID)就会速度慢。更新代价大,需要更新索引(B+树),所以主键一般不可修改。

非聚集索引即索引结构和数据分开存放的索引。(二级索引属于非聚集索引)

  • 优点:更新代价小,索引无数据。
  • 缺点:依赖有序数据。可能会二次查询,当查到索引对应的指针或主键后,可能还需要根据指针或主键再到数据文件或表中查询。

主键索引: 数据表的主键列使用的就是主键索引,一张数据表有只能有一个主键,并且主键不能为 null,不能重复。 二级索引: 二级索引又称为辅助索引,是因为二级索引的叶子节点存储的数据是主键。也就是说,通过二级索引,可以定位主键的位置。

  1. 唯一索引(Unique Key) :唯一索引也是一种约束。唯一索引的属性列不能出现重复的数据,但是允许数据为 NULL,一张表允许创建多个唯一索引。 建立唯一索引的目的大部分时候都是为了该属性列的数据的唯一性,而不是为了查询效率。
  2. 普通索引(Index) :普通索引的唯一作用就是为了快速查询数据,一张表允许创建多个普通索引,并允许数据重复和 NULL。
  3. 前缀索引(Prefix) :前缀索引只适用于字符串类型的数据。前缀索引是对文本的前几个字符创建索引,相比普通索引建立的数据更小, 因为只取前几个字符。
  4. 全文索引(Full Text) :全文索引主要是为了检索大文本数据中的关键字的信息,是目前搜索引擎数据库使用的一种技术。Mysql5.6 之前只有 MYISAM 引擎支持全文索引,5.6 之后 InnoDB 也支持了全文索引。

联合索引

补充一个最近校招面试遇到的,联合索引。

如 (a,b,c) 三个值联合索引,最左匹配原则,只能对 a、ab、abc 这三种进行索引。 因为它建立的是层次性多个 key 的 B+ 树,查询时,先匹配 a 的索引,此时 b、c 都是无序的。

举报

相关推荐

0 条评论