《二》数据保存原理与索引
一、数据保存原理
-
数据保存在聚簇索引B+树的叶子节点上
-
B+树
-
特点:
一棵m阶的B+树主要有这些特点:
-
每个结点至多有m个子女;
-
非根节点关键值个数范围:m/2 <= k <= m-1
-
相邻叶子节点是通过指针连起来的,并且是关键字大小排序的。
-
B+树内部节点是不保存数据的,只作索引作用,它的叶子节点才保存数据。
一颗3阶的B+树如下:
-
-
为什么MySQL单表建议最大2千万数据
-
B树和B+树有什么区别
- B树叶子节点不会形成单链表结构
- B树所有节点都能保存数据
-
为什么B+树叶子节点要形成单链表形式
mongBD为非关系型数据库,key : value形式,每次按key单次查找就能找到。关系型数据库存在全表查找和范围查找,叶子节点形成单链表结构能更方便的去全表遍历查找
-
-
B-或B树 (mongDB使用B树)
-
特点:
-
B树的每个节点可以存储多个数据,而且每个节点不止有两个子节点,最多可以有上千个子节点。
-
B树中每个节点都存放着索引和数据,数据遍布整个树结构,搜索可能在非叶子节点结束,最好的情况是O(1)。
-
一般一棵 B 树的高度在 3 层左右,3 层就可满足 百万级别的数据量
-
叶子节点不会形成链表
-
-
二、聚簇索引(一般为主键索引)
-
概念:
聚簇索引默认是主键,如果表中没有定义主键,InnoDB 会选择一个非空唯一索引代替。如果没有,InnoDB 会使用隐藏的
_rowid
列来作为聚簇索引,每个表都有且只有一个聚簇索引 -
特点:
- 聚簇索引将数据存储与索引放到了一块,索引结构(B+树)的叶子节点保存了行数据,内部节点保存聚簇索引的索引值
- 聚簇索引具有唯一性,一张表只有一个聚簇索引。
-
面试题:
- 聚簇索引(主键)需要注意什么?
- 当使用主键为聚簇索引时,主键最好不要使用uuid,因为uuid的值太过离散,不适合排序且可能出现新增加记录的uuid,会插入在索引树中间的位置,导致索引树调整复杂度变大,消耗更多的时间和资源。
- 建议使用int类型的自增,方便排序并且默认会在索引树的末尾增加主键值,对索引树的结构影响最小。而且,主键值占用的存储空间越大,辅助索引中保存的主键值也会跟着变大,占用存储空间,也会影响到IO操作读取到的数据量。
- 为什么主键通常建议使用自增id?
- 聚簇索引的数据的物理存放顺序与索引顺序是一致的,即只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上。如果主键不是自增id,会不断地调整数据的物理地址、分页。如果是自增的,只需要一 页一页地写,索引结构相对紧凑,磁盘碎片少,效率也高。
- 聚簇索引(主键)需要注意什么?
三、非聚簇索引(辅助索引)
-
概念:
除主键索引之外的其它索引,如复合索引、前缀索引、唯一索引等都是非聚簇索引,非聚簇索引的叶子节点是索引节点保存指向对应数据的主键值,内部节点保存非聚簇索引的索引值
-
特点:
- 将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置
- 每个表都可以没有非聚簇索引,也可以有多个非聚簇索引
- 非聚簇索引访问数据总是需要二次查找(回表)