MySQL数据库索引介绍

一、什么是索引

索引是mysql数据库中的一种数据结构,就是一种数据的组织方式,这种数据结构又称为key

表中的一行行数据按照索引规定的结构组织成了一种树型结构,该树叫B+树

二、为何要用索引

优化查询速度

注意:只能加速索引字段

三、如何正确的看待索引

错误的认知

项目上线之后,运行了一段是时间,发现项目运行极卡

想要加索引,最好提前加上,在开发之初,定位到常用的查询,为该字段提前创建索引,

在上线之后想加索引,光把问题定位到索引上就需要耗费很长时间,排查成本很高

索引越多越好

索引使用与加速查询的,降低写效率

如果某一张表的ibd文件中创建了很多棵索引树,意味着很小一个updata语句就会导致很多棵索引数都需要发生变化,从而把硬盘io打上去

四、储备知识

索引的根本原理就是把硬盘的io次数降下来

为一张表中的一行行记录创建索引就是为书的一页页内容创建目录

有了目录以后,我们以后的查询都应该通过目录去查询

一次磁盘io带来的影响

7200转/分钟

120转/s

慢在找的过程,读的过程是快的,(统称延迟时间)

一次io的延迟时间=平均寻道时间(大概需要5ms)+平均延迟时间(4ms)---》9ms

9ms对于一个人来说是很慢的,但是对于计算机来说是很长的,比如一台500 -MIPS 的机器每秒可以执行5亿条指令,应为指令是靠电的性质,换句话说就是执行一次io的时间可以执行450万条指令,数据动则十万百万乃至千万条数据,每次9ms的时间显然是一个灾难。

磁盘的预读

innodb存储引擎一页16k,即一次io读16k,

当一次io时,不光把当前磁盘地址的数据,而是把相邻的数据也都读取到内存缓存区内,因为局部预读性原理告诉我们,当计算机访问一个地址的数据的时候,与其相邻的数据也会很快被访问到。

五、创建索引的两个步骤

crate index xxx on user(id);

提取索引字段的值当做key,value就是对应本行记录

以key为基础比较大小,生成树型结构

创建索引最好是以占空间小,重复度低的字段创建索引

六、B+树

innodb存储引擎默认的索引结构为B+ 树,而B+树是由二叉树、平衡二叉树、B树演变而来的。

二叉树——》平衡二叉树——》B 树 ——》B + 树

基本概念:

leaf node:叶子节点

non-leaf node:根节点、树枝节点

二叉树:

二叉树有一个特点,它的左节点的 key 值小于当前节点的 key 值,而它的右节点 key 值大于当前节点 key 值。

创建二叉树索引

MySQL数据库索引介绍

取每一条记录的id值作为key值,value为本行完整记录,构建了树型结构后,查找的速度根树的高度有关系。

平衡二叉树:

平衡二叉树又称为AVL树,指的就是左子树的高度与右子树的高度相差不超过1,如下图所示;

MySQL数据库索引介绍

平衡二叉树相比于二叉树来说,查找效率更稳定,总体的查找速度也更快,但是并不是基于平衡二叉树构建索引就可以的。因为每个磁盘块只放一个节点,每个节点只放一组键值对,当数据过大的时候,二叉树的节点就会非常多,树的高度也会变高,查找的效率也会变低!

B 树:

就是构建一个单节点可以存储多个键值对的平衡树,就是B树。

MySQL数据库索引介绍

B树相对于平衡二叉树,每个节点存储了更多的键值和数据,每个节点有更多的子节点,子节点的个数称为阶,上图就是一个3阶B树,高度也会很低,这样B树的查找磁盘次数也会很少,这样数据的查找效率就会比平衡二叉树高。

B+ 树:

B+ 树是对B树的进一步优化。

MySQL数据库索引介绍

B+ 树和B 树有什么不同

B+ 树非叶子节点non-leaf node 上是不存储数据的,仅存储键,而B 树的非叶子节点中不仅存储键,也会存储数据。B + 树之所以这么做的意义在于;树一个节点就是一个页,而数据库中页的大小是固定的,innodb 存储引擎默认一页为16kb,所以在页大小固定的前提下,能往一个页中放入更多的节点,相应的树的阶数就会更大,那么树的高度必然更矮更胖,如此一来我们查找数据进行磁盘io次数又会再次减少,数据查询的效率也会更快。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzxdjy.html