mysql索引的数据结构

1.什么是mysql索引:

索引是帮助MySQL高效获取数据的排好序的数据结构

2.mysql索引的数据结构:B+tree 或者 hash

如下图,navcat中给数据表建索引的时候,可以选择索引的数据结构

2.1.mysql索引之B+Tree的特点:

2.1.1.非叶子节点不存储data,只存储索引(冗余),可以放更多的索引

(说人话:【非叶子节点】上没有存储对应的数据,只存着索引的字段,因为别的数据结构是key value形式,他们的【非叶子节点】既有key也有value,而B+tree【非叶子节点】只存着key,所以有限的空间可以存更多的索引key)

2.1.2.叶子节点包含所有索引字段

(说人话:【叶子节点】上存着所有的索引字段包括key,也包括value,所以拿走全部的【叶子节点】就相当于拿走了全部数据)

2.1.3.叶子节点用指针连接,提高区间访问的性能

(说人话:每个【叶子节点】上都包含有下一个【叶子节点】位置的信息,类似于linkedlist的意思,这样设计是为了方便获取全部数据时,不用走【非叶子节点】,直接拿走【叶子节点】就可以了)

2.2.mysql索引之Hash结构的特点:

2.2.1.对索引的key进行一次hash计算就可以定位出数据存储的位置。

(说人话:对索引的key进行hash计算之后,会得到一个值,根据这个值在hash结构中,可以得到数据存储的位置信息,从而获取到索引对应的值)

2.2.2.很多时候Hash索引要比B+ 树索引更高效

(说人话:因为哈希计算只需要经过一次计算,就可以得到数据的地址,从而直接取出来。

而B+Tree需要多次比较key值大小,才能获得key的对应地址,再取出来,比较key的时候会比hash花的时间更多。)

2.2.3.仅能满足 “=”,“IN”,不支持范围查询

(说人话:既然hash比B+tree更快,但是为什么不用呢,原因是因为功能少,范围查找时候hash结构的索引并不能使用。)

2.2.4.hash冲突问题

(说人话:经过hash计算,得到同一个数字的情况很常见,比如下图Alice和Jim经过hash计算,得到的hash值都是2这个数字,所以alice和jim对应的数据,就都放在了key=2的结构之中,找的时候会有找到多个值的情况出现。)

3.mysql的存储引擎:

MySQL中的数据用各种不同的技术存储在文件(或者内存)中。

这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。

通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。

3.1.常用的存储引擎之MyISAM

索引的value部分是指向数据的位置信息的数据。

3.2.常用的存储引擎之InnoDB(聚集索引)

3.2.1.表数据文件本身就是按B+Tree组织的一个索引结构文件

3.2.2.聚集索引-叶节点包含了完整的数据记录

主键索引结构的【叶子节点】是一条完整的数据,取出来可以直接用于代码逻辑中处理数据的

3.2.3.建议InnoDB表必须建主键,并且推荐使用整型的自增主键

因为每次新插入数据的时候,索引key自增直接排在索引最后就行,否则插入索引的中间,后面的索引数据整体都需要改变,会消耗资源。

3.2.4.非主键索引结构叶子节点存储的是主键值

(因为节省存储空间,并且可以保住数据的一致性)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值