——索引优化,能够说是数据库相关优化、理解尤为是查询优化中最经常使用的优化手段之一。因此,只有深刻索引的实现原理、存储方式、不一样索引间区别,才能设计或使用最优的索引,最大幅度的提高查询效率!php
至关于一个节点能够有大于2个子节点的二叉查找数。html
B tree :是一种自平衡数,可以保持数据有序(每一层都有序),查找、删除、插入时间为O(logn)。全部叶子节点都在一层,跟记录有关的信息会放在每个节点,因此查找一个记录跟二叉查找树同样,从根遍历。非叶子节点能够拥有可变数量的子节点(数量范围事先定好),当插入或删除致使超出范围,可能会分离或者合并。面试
B+ tree :可以保持数据有序(每一层都有序),查找、删除、插入时间为O(logn)。全部叶子节点都在一层,跟记录有关的信息都放在叶子节点上,非叶子节点只存放索引,且将叶子节点经过指针链接在一块儿,造成一条链表。因此对整棵树的遍历只要一次线性遍历叶子节点便可。算法
查找以典型的方式进行,相似于二叉查找树。起始于根节点,自顶向下遍历树,选择其分离值在要查找值的任意一边的子指针。在节点内部典型的使用是二分查找来肯定这个位置。sql
节点要处于违规状态,它必须包含在可接受范围以外数目的元素。数据库
1、B+Tree索引数据结构
一、概述架构
Mysql数据库中使用最频繁的索引类型,基本全部存储引擎都支持BTree索引。正是其优异的检索表现,才使其有这样的地位。优化
二、存储结构spa
正如其名,这类索引的物理文件大多就是以BTree结构来存储的,但会有不一样的存储引擎在使用BTree索引时,对存储结构稍做修改,好比MyISAM存储引擎,使用B+Tree的数据结构,它相对与BTree结构,全部的数据都存放在叶子节点上,且把叶子节点经过指针链接到一块儿,造成了一条数据链表,以加快相邻数据的检索效率。
(对B树、B+树不熟悉的,可参看博客索引基础——B-Tree、B+Tree、红黑树、B*Tree数据结构 或《算法导论》)
另外,对于innoDB存储引擎,虽然一样使用B+Tree做为索引的存储结构,但具体实现却与MyISAM大相径庭,这也是做为MyISAM与InnoDB存储引擎的一个重要区别反复被面试官问到。(关于MyISAM与InnoDB存储引擎可参看博客MySQL架构设计——MyISAM存储引擎与InnoDB存储引擎)
(1)MyISAM引擎索引结构的叶子节点的数据域,存放的并非实际的数据记录,而是数据记录的地址。索引文件与数据文件分离,这样的索引称为“非聚簇索引”。MyISAM的主索引与辅助索引区别并不大,只是主键索引不能有重复的关键字。
以下图所示为非聚簇索引的主键索引:
其检索算法:先按照B+Tree的检索算法检索,找到指定关键字,则取出对应数据域的值,做为地址取出数据记录。
(2)InnoDB引擎索引结构的叶子节点的数据域,存放的就是实际的数据记录(对于主索引,此处会存放表中全部的数据记录;对于辅助索引此处会引用主键,检索的时候经过主键到主键索引中找到对应数据行),或者说,InnoDB的数据文件自己就是主键索引文件,这样的索引被称为“聚簇索引”,一个表只能有一个聚簇索引。
以下图所示为聚簇索引的主键索引:
MySQL中只有memory支持Hash索引
参考:https://blog.csdn.net/zhangliangzi/article/details/51366345