索引
我们对索引这个名词最早的认知应该来自初学任何一门程序设计语言时 的数组吧,数组的下标即是索引,索引有什么用?我们的计算机没有想 像的那么聪明,cpu在查找数据是你如果不指定方式他只会从头到尾依次 遍历,有了索引之后我们就可以对Cpu进行优雅的指挥啦。快速定位,提 升效率!
MySQL中的索引
MySQL的定位为数据库,数据库的存在当然是为了存储数据,而生产环境下 9成的操作都是读操作,MySQL的索引就是方便读操作提高查询结果的响应 速度,进而提高数据库的性能。 一句话来讲就是:MySQL中的索引就是能够帮助MySQL快速查找数据的已经 排好序的数据结构。
MySQL中的索引方法
我一菜鸟你可能对我说的话有质疑,所以打开navicat(MySQL的可视化工具) 截图当作证据。
从图中可以看到MySQL提供了两种索引方法BTREE和Hash. 其实MySQL的索引业内都叫其B+TREE他是MySQL对B-TREE的改良,B+TREE 怎么来的我们以图片的形式来见证他的演化。
二叉树
二叉树典型的结构就是第一个节点为根节点,之后的节点会和根节点作比较 比根节点大的会成为根节点的右子树,比根节点小的会成为左子树。最优的 时间复杂度为O(nlogn),如果MySQL中的索引字段从0开始依次递增就会出现下 面这种情况
是不是长得非常像链表呢,时间复杂度也变成了O(n),所以就有了下面的 红黑树。
二叉平衡树(红黑树)
他会根据自身的平衡规则(我在ConcurrentHashmap中写到了平衡规则)使数据 结构本身始终维持二叉树的结构。但是MySQL中动辄千万条数据,最后形成的二叉树 高度依然很高,速度之提升了不到一半,这不是我们想看到的。所以我们可以对红黑 树进行横向扩展一个节点保存多个节点让二叉树的高度小于等于4这就是下面的B-TREE
B-TREE
有的人可能会说我吹牛,就这点数据高度就为3了,千万条数据高度还能保持在4之内?
一个节点16KB一条数据不超所1KB留下8kb保存下层节点指针 B-TREE的结构,千万条高度为4足矣。既然B-TREE者这么强,那么B+TREE 又为何而来呢?select filednames from tablename where filednames < xxx B-TREE怎么办呢? 这时就要看B+TREE了
B+TREE
其实B+TREE就是在B-TREE的基础上根节点有了指向相邻子树的指针 并且进行查询时MySQL会将节点加载到内存中避免了大量的磁盘IO。
HASH索引
HASH索引就是对指定字段进行哈希算算(例如推特的雪花算法,Redis的CRC16) 求出一个唯一的值作为地址指针,直接拿到数据保存在硬盘的位置。 其实理解了B+TERR对B-TREE的改良,你也就能理解为什么HASH索引 不常见了,当出现范围查找时,HASH怎么办呢?
聚簇索引与非聚簇索引
聚簇与非聚簇的区别其实是由MySQL的存储引擎导致的,先上张图 感受一下差异吧。
可以看出来使用InnoDB存储引擎的表索引和数据存在一个文件里,而 使用Mylsam存储引擎的表索引与数据存在了两个文件。表索引和数据 存在一个文件里InnoDB使用的即是聚簇索引B+TERR的日子节点保存的 是索引所在行数据,而MylSAM的B+TREE的日子节点存储的是数据文件 中对应的的磁盘地址。