《二》数据保存原理与索引


一、数据保存原理

  • 数据保存在聚簇索引B+树的叶子节点上

  • B+树

    1. 特点

      ​ 一棵m阶的B+树主要有这些特点:

      • 每个结点至多有m个子女;

      • 非根节点关键值个数范围:m/2 <= k <= m-1

      • 相邻叶子节点是通过指针连起来的,并且是关键字大小排序的。

      • B+树内部节点是不保存数据的,只作索引作用,它的叶子节点才保存数据。

      ​ 一颗3阶的B+树如下:

    img

    1. 为什么MySQL单表建议最大2千万数据

    2. B树和B+树有什么区别

      1. B树叶子节点不会形成单链表结构
      2. B树所有节点都能保存数据
    3. 为什么B+树叶子节点要形成单链表形式

      mongBD为非关系型数据库,key : value形式,每次按key单次查找就能找到。关系型数据库存在全表查找和范围查找,叶子节点形成单链表结构能更方便的去全表遍历查找

  • B-或B树 (mongDB使用B树)

    1. 特点

      • B树的每个节点可以存储多个数据,而且每个节点不止有两个子节点,最多可以有上千个子节点。

      • B树中每个节点都存放着索引和数据,数据遍布整个树结构,搜索可能在非叶子节点结束,最好的情况是O(1)。

      • 一般一棵 B 树的高度在 3 层左右,3 层就可满足 百万级别的数据量

      • 叶子节点不会形成链表

二、聚簇索引(一般为主键索引)

  • 概念:

    聚簇索引默认是主键,如果表中没有定义主键,InnoDB 会选择一个非空唯一索引代替。如果没有,InnoDB 会使用隐藏的_rowid 列来作为聚簇索引,每个表都有且只有一个聚簇索引

  • 特点:

    • 聚簇索引将数据存储与索引放到了一块,索引结构(B+树)的叶子节点保存了行数据,内部节点保存聚簇索引的索引值
    • 聚簇索引具有唯一性,一张表只有一个聚簇索引。
  • 面试题:

    1. 聚簇索引(主键)需要注意什么?
      • 当使用主键为聚簇索引时,主键最好不要使用uuid,因为uuid的值太过离散,不适合排序且可能出现新增加记录的uuid,会插入在索引树中间的位置,导致索引树调整复杂度变大,消耗更多的时间和资源。
      • 建议使用int类型的自增,方便排序并且默认会在索引树的末尾增加主键值,对索引树的结构影响最小。而且,主键值占用的存储空间越大,辅助索引中保存的主键值也会跟着变大,占用存储空间,也会影响到IO操作读取到的数据量。
    2. 为什么主键通常建议使用自增id?
      • 聚簇索引的数据的物理存放顺序与索引顺序是一致的,即只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上。如果主键不是自增id,会不断地调整数据的物理地址、分页。如果是自增的,只需要一 页一页地写,索引结构相对紧凑,磁盘碎片少,效率也高。

三、非聚簇索引(辅助索引)

  • 概念:

    除主键索引之外的其它索引,如复合索引、前缀索引、唯一索引等都是非聚簇索引,非聚簇索引的叶子节点是索引节点保存指向对应数据的主键值,内部节点保存非聚簇索引的索引值

  • 特点:

    • 将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置
    • 每个表都可以没有非聚簇索引,也可以有多个非聚簇索引
    • 非聚簇索引访问数据总是需要二次查找(回表)
posted on 2024-09-08 01:39  stone_mll  阅读(4)  评论(0编辑  收藏  举报