mysql添加数组_【MySQL那些事】一文详解索引原理

本文深入探讨MySQL索引的使用,包括主键索引和唯一索引,并详细解析哈希索引的工作原理,阐述在哈希冲突时的处理方式。同时,文章通过对比哈希索引与B+树索引,引导读者理解不同索引类型的优缺点。
摘要由CSDN通过智能技术生成

学习任何技术,首先我们要知道怎么用,熟练之后再探究其原理,最后再根据业务进行优化。 ——船长

42e43630712ec48bf04b3d619a4950b2.gif MySQL的索引有哪些?
主键索引:表的主键列会默认添加索引,索引中保存了该行记录的所有数据唯一索引(upique):该列的所有值必须唯一普通索引(normal):普通列的一种索引聚合索引:是普通索引中的一种,但是它是由多个列组成的索引

42e43630712ec48bf04b3d619a4950b2.gif索引怎么用?

假设我们有几张表,如下

d55c79f95f54b0ba9cd81087932f0fe1.png

使用navicat设计学生student表,并添加索引如下

7e52ae0209d377814a7ae647ccc00a13.png

1、主键索引

mysql会为每个表的主键自动添加索引,在其索引树的叶子节点中,保存着主键所在行的所有数据,这个后面会讲。也就是说只要找到主键,就代表找到了该行记录,所以使用了主键索引速度会比较快

824e39e25e00f72544eb858d1e7063ec.png

2、唯一索引

唯一索引对应的列,其数据不可重复,这点相当于主键,不同的是其索引树的叶子节点保存的不是所在行的所有数据,而是该列的值,查询速度比主键慢一些

3f90e4a7f9ef6c7bfc2c5d4d6e0f669b.png

3、普通索引

普通索引就没什么好说了,其值可以重复,而且索引树叶子节点保存的就是该列的值,而不是整行数据

6214af9e9bebf7d14851db65988f7dea.png

4、聚合索引

当需要联合几个字段去查询时,使用聚合索引的速度会比多个普通索引快,因为每个索引对应一棵索引树,多个普通索引,虽然都用上了索引,但是要遍历好几个索引树,而使用聚合索引只需遍历一棵索引树

5ca29300250bc90c1e4ecab042143188.png

如果对索引树一点了解都没有的同学,可以先看看下面的分析,再回过头来理解一下这四种索引,必然会有焕然一新的感觉

42e43630712ec48bf04b3d619a4950b2.gif索引的底层结构是什么?

索引底层结构分为全文索引、哈希索引、B+树索引全文索引:只有MyISAM引擎支持,不作介绍哈希索引:计算索引列的hashCode,并将其存在索引中,如果出现冲突,就以链表的形式存储,类似hashMap结构B+树索引:将索引列的值排序,并放入索引树中的指定位置(Mysql默认的索引结构)

42e43630712ec48bf04b3d619a4950b2.gif哈希索引的原理

hash是一种key-value形式的数据结构,哈希索引是以索引列的hashCode为键,数据行的地址指针为值形成的一种索引,它是一块非常紧凑的地址空间,可以将其视为数组

46ea515f757b651550e218f6f4daac04.png

如果我们要查询【刘备】,那么先通过计算哈希码hashCode(刘备)=002得到,然后在哈希索引中找到key=002的位置,拿到真正保存数据的磁盘地址311,再去找到数据行。

可见这里查找了两次,第一次是根据hashCode找到地址,第二次是根据地址找到数据行,但是这种查询速度是非常快的,因为它没有去遍历每一条数据行,而是通过hashCode直接找到数据行的磁盘地址。

那如果发生hash冲突怎么办呢?例如关羽和张飞的hashCode都等于010,这时候就会将张飞接在关羽的后面,形成一种链式结构,然后在关羽的下一个地址指针中保存张飞的地址。

当查找【张飞】时,通过hashCode(张飞)=010找到地址45,再通过地址找到了关羽,通过判断姓名【张飞】!=【关羽】,于是通过下一个地址指针46继续查找,第二次就找到了张飞。

这种解决冲突的方式称之为链地址法。所以哈希索引的结构就是数组+链表的形式,与hashMap雷同,但是当冲突太多导致链表很长时,操作数据的时候还是会一直遍历链表才能找到数据,这就会影响性能。

大家可以通过哈希索引的结构,再根据自己平时写sql用到的条件,思考一下他有什么优缺点,我将在文末进行总结。

42e43630712ec48bf04b3d619a4950b2.gifB+树索引原理

B+树的演变

二叉树 ——> 二叉搜索树 ——> 平衡二叉树 ——>B树 ——>B+树
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值