04 索引

为什么需要索引

索引是一种数据结构,作用是提高数据的查询效率。

索引数据结构

MYSQL索引是在存储引擎层实现的。

哈希表

优点:新增数据时只需要根据key计算找到对应桶然后追加。
缺点:由于key是无序的,做范围查询只能全部key扫描一遍
使用场景:只适合等值查询,例如KV数据库

数组

优点:查询效率很高。等值查询时间复杂度为O(log(n)),范围查询左区间时间复杂度也为O(log(n))
缺点:插入效率低

二叉搜索树

插入和查找时间复杂度都是O(log(n))

大多数数据库并不使用二叉树,因为索引不仅存在内存,也存在磁盘。二叉树每一层访问可能都要访问一个新的数据块,数据量越大树越高,磁盘随机读代价很高,所以二叉树跟磁盘不适配。为了尽量少读磁盘,访问尽量少的数据块,树的高度不能太高,N叉树的N取决于数据块的大小。N叉树由于读写性能好,适配磁盘的访问模式,广泛用于数据库。

InnoDB的索引结构

1.每个索引在InnoDB里都对应一颗B+树
2.InnoDB的表都是根据主键顺序以索引形式存放的,主键索引存的就是表的数据。
3.只有叶子结点存数据,主键索引的叶子结点存整行数据,二级索引的叶子结点存主键的值。
4.基于主键索引和基于二级索引的查询的区别?
基于主键索引查询,只需要搜索主键索引这棵B+树
基于二级索引查询,先搜索二级索引B+树,再用查到的主键到主键索引这颗B+树搜索,要多搜索一棵树。

索引维护

1.为了维护索引有序,需要插入数据时需要进行维护
非追加插入数据的情况,后面的数据记录需要移动,如果页空间不够了,会造成页分裂,造成性能下降,也造成磁盘空间利用率下降
数据页利用率过低的情况会造成页合并,如何完成的?TODO
2.为什么用自增ID作为主键?
(1)性能方面:自增ID都是追加写,不会挪动后面的记录,不会造成页分裂。
(2)存储空间:比如用整型做主键,二级索引叶子结点小,占用的空间也小。

3.什么情况下适合用业务ID做主键?
只有一个索引且是唯一的一个索引,不用担心二级索引空间的问题,因为没有二级索引。这个就是KV场景。

问题

1.B+树只有叶子结点存放数据吗?
是的。
https://zhuanlan.zhihu.com/p/149287061
2.什么是buffer pool?和Linux页缓存的关系是什么?
InnoDB使用buffer pollo缓存数据页来提高随机读写效率,页大小为16KB
InnoDB读取数据页,会首先从buffer pool读取,buffer pool没有命中则从磁盘页缓存加载,页缓存没命中则从磁盘加载。
InnoDB写数据,会先写入buffer pool,然后刷新到页缓存,等待后续刷新。TODO

https://xiaolincoding.com/mysql/buffer_pool/buffer_pool.html
https://www.cnblogs.com/lidong422339/p/17664515.html

3.buffer pool脏页刷盘,只刷到磁盘页缓存,有宕机数据丢失的风险?TODO

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值