很多时候遇到慢查询,我们脑海里肯定第一个想法就是想查看sql中是否有用索引,如果用索引的话,这个索引类型是否合适,那么为什么合适的索引会加快sql的查询速度呢,这里做个介绍
如图,如果正常的一个表,没有加任何的索引,那么如果我想查找一个数,就得挨个遍历,一个个查找,当然速度就是最慢的了,而索引呢,根据Mysql的官方介绍:
1.索引是帮助mysql高效获取数据的排好序的数据结构
也有很多人说起索引,就说是把数据做成像目录一样的数据,如图索引的结构是有几种的:二叉树,红黑树,Hash表和B-Tree,如果我们做了一个二叉树的索引结构的话,那么如图中右侧,每个二叉树的节点都是key-value形式的数据结构,key就是索引的字段,value是该条数据存储的内存地址,所以当我们根据索引查找的时候,尤其在二叉查找树中查询数,那么如图中的搜索,最多仅需要3次查询即可找到想要找到的数据了。
2.为什么mysql没有选择使用二叉树作为索引的存储结构呢?
如图中,如果我们使用一个字段作为索引,但是这个字段的值是依次递增的,这样的数据使用二叉树的存储结构就成为了图中这个样子,那么这个时候我们在查询,那么就跟没有使用索引一样,查询数据总是要挨个遍历数据才能找到。
所以如果索引的字段值是排序的,那么二叉树是无效的
3.红黑树的结构
首先我们需要了解红黑树的原理(可以参考我的帖子https://www.jianshu.com/writer#/notebooks/49569813/notes/84210925/preview)
红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
注意:
(01) 特性(3)中的叶子节点,是只为空(NIL或null)的节点。
(02) 特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。