04 | 深入浅出索引(上)

索引的作用:提高数据查询效率,就像书的目录一样。

索引模型

常见的索引模型:哈希表、有序数组、搜索树。

 

哈希表:一种以键-值(key-value)存储的数据结构。

哈希思路:把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置

哈希冲突的处理办法:链表

哈希表适用场景:哈希表的好处是新增速度会很快,只需要往后追加;缺点是,因为不是有序的,所以哈希索引做区间查询的速度是很慢的。所以,哈希表这种结构适用于只有等值查询的场景。

 

有序数组:在等值查询和范围查询场景中的性能都非常优秀。按顺序存储。查询用二分法可以快速查询,时间复杂度是:O(log(n))。查询效率高,更新效率低。

所以,有序数组只适用于静态存储引擎。

 

二叉搜索树:每个节点的左孩子小于父节点,父节点又小于右孩子,查询时间复杂度O(log(n)),更新时间复杂度O(log(n))

数据库存储大多不使用二叉树,因为索引不止在内存中,还要写到磁盘上,树高过高会导致过多的读磁盘,影响效率,所以会使用N叉树(N的值取决于数据块的大小)。

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

InnoDB的索引模型

InnoDB中的索引模型:B+树,每一个索引在InnoDB里面对应一颗B+树。B+树能够很好地配合磁盘的读写特性,减少单次查询的磁盘访问次数。

索引类型:主键索引(也称为聚簇索引)、非主键索引(也称为二级索引)。主键索引的叶子节点存的是整行数据,非主键索引的叶子节点内容是主键的值。

主键索引和普通索引的区别:主键索引只要搜索ID这个B+树即可拿到数据。普通索引先搜索索引拿到主键值,再到主键索引树搜索一次,这个过程称为回表。所以尽量建议使用主键查询。

索引维护

数据页分裂、数据页合并

一个数据页满了,按照B+树算法,新增加一个数据页,叫做页分裂,会导致性能下降,除了性能外,空间利用率降低大概50%。当相邻两个数据页利用率很低的时候会做数据页合并,合并的过程是分裂过程的逆过程。

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

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

 

上一篇:03 | 事务隔离:为什么你改了我还看不见?

下一篇:05 | 深入浅出索引(下)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值