一、什么是索引
索引是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 值。
创建二叉树索引
取每一条记录的id值作为key值,value为本行完整记录,构建了树型结构后,查找的速度根树的高度有关系。
平衡二叉树:
平衡二叉树又称为AVL树,指的就是左子树的高度与右子树的高度相差不超过1,如下图所示;
平衡二叉树相比于二叉树来说,查找效率更稳定,总体的查找速度也更快,但是并不是基于平衡二叉树构建索引就可以的。因为每个磁盘块只放一个节点,每个节点只放一组键值对,当数据过大的时候,二叉树的节点就会非常多,树的高度也会变高,查找的效率也会变低!
B 树:
就是构建一个单节点可以存储多个键值对的平衡树,就是B树。
B树相对于平衡二叉树,每个节点存储了更多的键值和数据,每个节点有更多的子节点,子节点的个数称为阶,上图就是一个3阶B树,高度也会很低,这样B树的查找磁盘次数也会很少,这样数据的查找效率就会比平衡二叉树高。
B+ 树:
B+ 树是对B树的进一步优化。
B+ 树和B 树有什么不同
B+ 树非叶子节点non-leaf node 上是不存储数据的,仅存储键,而B 树的非叶子节点中不仅存储键,也会存储数据。B + 树之所以这么做的意义在于;树一个节点就是一个页,而数据库中页的大小是固定的,innodb 存储引擎默认一页为16kb,所以在页大小固定的前提下,能往一个页中放入更多的节点,相应的树的阶数就会更大,那么树的高度必然更矮更胖,如此一来我们查找数据进行磁盘io次数又会再次减少,数据查询的效率也会更快。