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
原文地址:https://blog.csdn.net/qq_41904699/article/details/135833612
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!