mysql索引--基于InnoDB引擎

索引数据结构类型

    索引可以使用的数据结构主要有BTree索引和哈希索引,而在mysql中BTree索引使用的是B树中的B+Tree,下文中主要来讲解一下基于B+Tree结构的mysql索引。

B-Tree和B+Tree的区别

B-Tree

B-Tree属于多叉树又名平衡多路查找树

(1)排序方式:所有节点关键字是按递增次序排列,并遵循左小右大原则;

(2)子节点数: 非叶节点的子节点数>1,且<=M ,且M>=2,空树除外(注:M阶代表一个树节点最多有多少个查找路径,M=M路,当M=2则是2叉树,M=3则是3叉);

(3)关键字数: 根节点和叶子节点的关键字数是>=1且<=(M-1)的,非根节点和非叶子节点(也称作枝节点)关键字数量是>=ceil(M/2)-1且<=(M-1)(注:ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2);

(4)所有叶子节点均在同一层、叶子节点除了包含了关键字和关键字记录的指针外也有指向其子节点的指针只不过其指针地址都为null对应下图最后一层节点的空格子;

图示(M=4):

4阶BTree

如上图所示,

非叶子节点的节点数是大于1且小于等于4的;

根节点和叶子节点的关键字数是>=1且<=3的,非根节点和非叶子节点(也称作枝节点)关键字数量是>=1且<=3的;

B+Tree

B+Tree其实是对B-Tree做了一个升级。

(1)B+跟B树不同B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子节点所能保存的关键字大大增加;

(2)B+树叶子节点保存了父节点的所有关键字记录的指针,所有数据地址必须要到叶子节点才能获取到。所以每次数据查询的次数都一样;

(3)B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针。

(4)非叶子节点的子节点数=关键字数(来源百度百科)(根据各种资料 这里有两种算法的实现方式,另一种为非叶节点的关键字数=子节点数-1(来源维基百科),虽然他们数据排列结构不一样,但其原理还是一样的Mysql 的B+树是用第一种方式实现);

根据usfca定义B+Tree的结构如下:

B+Tree的生成(可以通过链接在线构建B+Tree)

4阶的B+Tree

但是实际MYSQL中的B+Tree的结构如下:


mysql中的B+Tree

索引类型

从物理存储角度索引分为聚簇索引和非聚簇索引。

聚簇索引

聚簇索引是按照数据存放的物理位置为顺序的,在B+Tree树中叶子节点中存放的是数据本身,主键索引就使用了聚簇索引,所以一个表中只能有一个聚簇索引。

非聚簇索引

非聚簇索引的叶子节点存放的是主键值,因此使用非聚簇索引的索引查找的过程是先找到主键值,然后再根据主键值找到对应数据的。

MYSQL中的索引类型

基于上述类型又分为主键索引、普通索引、唯一索引、组合索引、全文索引(仅MYISAM引擎支持,暂不讨论)

主键索引

主键索引使用聚簇索引类型,值时唯一且不能为空的。

普通索引

是最基本的索引,使用非聚簇索引类型。

唯一索引

与普通索引类似,只是需要索引的值必须唯一,但允许又空值

组合索引

将数据库中的两个及两个以上字段作为索引,也是使用了非聚簇索引,遵循最左前缀原则。

你可能感兴趣的:(mysql索引--基于InnoDB引擎)