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.非主键索引结构叶子节点存储的是主键值
(因为节省存储空间,并且可以保住数据的一致性)