索引与B+树浅层总结1
为什么要有索引?
一般应用系统,读写比列在10:1左右,插入操作和一般的更新操作很少出现问题,在生产环境中,我们遇到最多的,最容易出问题的是一些复杂的查询问题,因此对查询语句的优化就是重中之重了,只要查询就提到了索引
什么是索引?
索引在MySQL中也叫是⼀种“键”,是存储引擎⽤于快速找到记录的⼀种数据结构。索引对于良好的性能 非常关键,尤其是当表中的数据量越来越⼤时,索引对于性能的影响愈发重要。 索引优化应该是对查询性能优化最有效的⼿段了。索引能够轻易将查询性能提⾼好⼏个数量级。 索引相当于字典的⾳序表,如果要查某个字,如果不使⽤⾳序表,则需要从⼏百⻚中逐⻚去查。
一:索引原理
索引的目的在于提高查询效率
本质都是:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。
二:磁盘IO与预读、
磁盘IO读取数据
⼀次磁盘IO的时间约等于5+4.17 = 9ms左右,听起来还挺不错的,但
要知道⼀台500 -MIPS(Million Instructions Per Second)的机器每秒可以执⾏5亿条指令,因为指令依靠的是电的性质,换句话说执⾏⼀次IO的时间可以执⾏约450万条指令,数据库动辄⼗万百万乃⾄千万级数据,每次9毫秒的时间,显然是个灾难
考虑到磁盘IO是非常⾼昂的操作,计算机操作系统做了⼀些优化,当⼀次IO时,不光把当前磁盘地址的数据,⽽是把相邻的数据也都读取到内存缓冲区内,因为局部预读性原理告诉我们,当计算机访问⼀个地址的数据的时候,与其相邻的数据也会很快被访问到。每⼀次IO读取的数据我们称之为⼀⻚(page)。具体⼀⻚有多⼤数据跟操作系统有关,⼀般为4k或8k,也就是我们读取⼀⻚内的数据时候,实际上才发⽣了⼀次IO,这个理论对于索引的数据结构设计非常有帮助。
三:索引的数据结构
树
树状图是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合,把他叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶是朝下的。
它具有以下特点:
1:每个结点有零个或多个结点;
2:没有父结点的点称为根结点;
3:每一个非根结点有且只有一个父结点;
4:除了根结点外,每个子结点可以分为多个不相交的子树。
B+树
任何⼀种数据结构都不是凭空产⽣的,⼀定会有它的背景和使⽤场景,我们需要这种数据结构能够做些什么,其实很简单,那就是:每次查找数据时把磁盘IO次数控制在⼀个很⼩的数量级,最好是常数数量级。
那么我们就想到如果⼀个⾼度可控的多路搜索树是否能满⾜需求呢?就这样,b+树应运⽽⽣(B+树是通过⼆叉查找树,再由平衡⼆叉树,B树演化⽽来)。
b+树性质:
1:索引的最左匹配特性
2:..........
四.聚集索引与辅助索引
数据库中的B+树索引可以分为聚集索引(clustered index)和辅助索引(secondary index),
聚集索引与辅助索引相同的是:不管是聚集索引还是辅助索引,其内部都是B+树的形式,即⾼度是平衡的,叶
⼦结点存放着所有的数据。
聚集索引与辅助索引不同的是:叶⼦结点存放的是否是⼀整⾏的信息
1.聚集索引
#InnoDB存储引擎表是索引组织表,即表中数据按照主键顺序存放。⽽聚集索引(clustered index)就是按照每张表的主键构造⼀棵B+树,同时叶⼦结点存放的即为整张表的⾏记录数据,也将聚集索引的叶⼦结点称为数据⻚。聚集索引的这个特性决定了索引组织表中数据也是索引的⼀部分。同B+树数据结构⼀样,每个数据⻚都通过⼀个双向链表来进⾏链接。
如果未定义主键,MySQL取第⼀个唯⼀索引(unique)⽽且只含非空列(NOT NULL)作为主键,InnoDB使⽤它作为聚簇索引。
如果没有这样的列,InnoDB就⾃⼰产⽣⼀个这样的ID值,它有六个字节,⽽且是隐藏的,使其作为聚簇索引。
由于实际的数据⻚只能按照⼀棵B+树进⾏排序,因此每张表只能拥有⼀个聚集索引。在多数情况下,查询优化器倾向于采⽤聚集索引。因为聚集索引能够在B+树索引的叶⼦节点上直接找到数据。此外由于定义了数据的逻辑顺序,聚集索引能够特别快地访问针对范围值得查询�
聚集索引的好处之⼀:它对主键的排序查找和范围查找速度非常快,叶⼦节点的数据就是⽤户所要查询的数据。
聚集索引的好处之⼆:范围查询(range query),即如果要查找主键某⼀范围内的数据,通过叶⼦节点的上层中间节点就可以得到⻚的范围,之后直接读取数据⻚即可
2:辅助索引
表中除了聚集索引外其他索引都是辅助索引(Secondary Index,也称为非聚集索引),与聚集索引的区别是:
辅助索引的叶⼦节点不包含⾏记录的全部数据。
叶⼦节点除了包含键值以外,每个叶⼦节点中的索引⾏中还包含⼀个书(bookmark)。该书签⽤来告诉InnoDB存储引擎去哪⾥可以找到与索引相对应的⾏数据。
由于InnoDB存储引擎是索引组织表,因此InnoDB存储引擎的辅助索引的书签就是相应⾏数据的聚集索引键。
聚集索引与辅助索引的区别:
聚集索引
1.纪录的索引顺序与物理顺序相同 因此更适合 between and 和order by操作
2. 叶子结点直接对应数据 从中间级的索引页的索引行直接对应数据页
3.每张表只能创建一个聚集索引
非聚集索引
1.索引顺序与物理顺序无关
2.叶子结点不直接指向数据页
3.每张表可以有多个辅助索引,需要更多磁盘和内容 多个索引会影响insert 和update 的速度

浙公网安备 33010602011771号