MySQL实战45讲学习笔记:第四讲

一、索引模型
1.索引的作用

索引的出现其实是为了提高数据查询的效率,就像书的目录一样 提高数据查询效率

2.索引模型的优缺点比较

哈希表/有序数组/二叉搜索/b+tree

1>哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的键即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。

不可避免地,多个 key 值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是,拉出一个链表。[哈希碰撞的解决方法]

哈希表这种结构适用于只有等值查询的场景

2>如果仅仅看查询效率,有序数组就是最好的数据结构了。但是,在需要更新数据的时候就麻烦了,你往中间插入一个记录就必须得挪动后面所有的记录,成本太高。

所以,有序数组索引只适用于静态存储引擎,比如你要保存的是 2017 年某个城市的所有人口信息,这类不会再修改的数据。

3>二叉搜索树的特点是:父节点左子树所有结点的值小于父节点的值,右子树所有结点的值大于父节点的值。这样如果你要查 ID_card_n2 的话,按照图中的搜索顺序就是按照 UserA -> UserC -> UserF -> User2 这个路径得到。这个时间复杂度是 O(log(N))。

因为树高过高会出现磁盘io过多

4>

二、InnoDB索引模型

1、二叉树是搜索效率最高的,但是实际上大多数的数据库存储却并不适用二叉树?

1、其原因是,索引不止在内存中,还要写到磁盘上

2、N叉树由于在读写上的性能优点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中了

3、数据库底层存储的核心就是基于这些数据模型的,每碰到一个新数据库,我们需要先关注它的数据模型,这样才能从离乱山给分析出数据库的适应场景

4、不同存储引擎的索引的工作方式并不一样,而即使多个存储引擎支持同一类型的索引,其底层的实现也可能不同

由于InnoDB存储引擎在MySQL数据库中使用最为广泛,所以下面我就以为例,和你分析一下其中的索引模型

2、索引类型

主键索引:主键索引的叶子节点存的是整行的数据(聚簇索引),

非主键索引:非主键索引的叶子节点内容是主键的值(二级索引)

3、主键索引和普通索引的区别:

1、主键索引只要搜索ID这个B+Tree即可拿到数据。

1

如果语句是 select * from T where ID=500,即主键查询方式,则只需要搜索 ID 这棵 B+ 树

2、普通索引先搜索索引拿到主键值,再到主键索引树搜索一次(回表)

1

如果语句是 select * from T where k=k=5,即普通索引查询方式,则需要先搜索 k 索引树,得到到 ID 的值为 500,再到 ID 索引树搜索一次。这个过程为回表

也就是说,基于非主键索引的查询需要多扫描一棵树,因此,我们在应用中应该尽量使用主键查询

​​​​​​​

三、索引维护

1、什么是自增主键

自增主键是指自增列上定义的主键,插入新记录的时候可以不指定ID的值,系统会获取当前ID最大值加1作为下一条记录的ID值

也就是说,自增主键的插入数据模式,正符合我们前面提到的递增插入的场景。每次插入一条新记录,都是追加操作,都不涉及到挪动其他记录,也不会触发叶子节点的分裂

2、数据页满了怎么办?

一个数据页满了,按照B+Tree算法,新增加一个数据页,叫做页分裂,会导致性能下降。空间利用率降低大概50%。

当相邻的两个数据页利用率很低的时候会做数据页合并,合并的过程是分裂过程的逆过程。

分裂合并示意图

3、主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小

由于每个非主键索引的叶子节点上都有主键的值,

1、如果用身份证号做主键,那么每个二级索引的叶子节点占用的20个字节,

2、而如果用整型做主键,则只要4个字节,

3、如果是长整型则是8个字节

从性能和存储空间方面考量,自增主键往往是更合理的选择。

4、什么场景适合直接用业务字段直接做主键?

1、只有一个索引;

2、该索引必须是唯一索引。

你一定看出来了,这就是典型的KV场景

由于没有其他索引,所以也就不用考虑其他索引的叶子节点大小的问题

这时候我们就要有限考虑上一段的“尽量使用主键查询”原则,直接将这个索引设置为主键,可以避免每次查询需要搜索两棵树

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值