日期:2014-05-16  浏览次数:20545 次

MySql数据库 索引原理

?

?

本文引用文章如链接:

http://www.codinglabs.org/html/theory-of-mysql-index.html#more-100

参考书籍:Mysql技术内幕


本文主要是阐述mysql索引机制,主要是说明存储引擎Innodb



第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础。

第二部分结合MySQL数据库中InnoDB数据存储引擎中索引的架构实现讨论聚集索引、非聚集索引及覆盖索引等话题。

第三部分讨论MySQL中高性能使用索引的策略。

?

一、数据结构及算法理论

?

Innodb存储引擎实现索引的数据结构是B+树,下面介绍几种数据结构,一步步阐述为什么要使用B+树

?

1.1

?

B+树索引的构造类似于二叉树,根据键值快速找到数据。但是B+树种的B不是代表二叉,而是代表平衡。注意:B+树索引能找到的只是被查找数据行所在的页。然后数据库通过把页读入内存,再在内存中进行查找,最后查到数据。

?

下面介绍二分查找法:将记录按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,例如:5、10、19、21、31、37、42、48、50、52这10个数,如图所示:

?



?用了三次查找速度就能找到48。如果是顺序查找的话,则需要8次。对于上面10个数来说,顺序查找的平均查找次数为5.5次,而二分查找法为2.9次,在最坏的情况下,顺序查找的次数为10,而二分查找的次数为4。二分查找在innodb中Page Directory中的槽是按照主键的顺序存放的,对于每一条具体记录的查询时通过对Page Directory进行二分查找。

?

1.2

?

二叉查找树

?


数字代表每个节点的键值,二叉查找树中,左子树的键值总是小于跟的键值,右子树的键值总是大于跟的键值。通过中序遍历得到键值:2、3、5、6、7、8。

?

二叉查找树的平均查找次数为2.3次。但是二叉查找树是可以任意构建,如构造如图:



?但是这样跟顺序查找就差不多,所以就引用了平衡二叉树的思想,AVL树。

?

1.3 ?

?

定义:符合二叉查找树的定义,其次必须满足任何节点的左右两个子树的高度最大差为1。

?

平衡二叉树虽然查找速度非常快但是维护一颗平衡二叉树的代价是非常大,通常需要1次或多次左旋和右旋来得到插入或更新后树的平衡性。


1.4

?

B+树的特性:

?


所有记录都在叶节点,并且是顺序存放,各个叶节点(页为单位)都是逻辑的连续存放,是一个双向循环链表。

B+树插入必须保证插入后叶节点中的记录依然排序,所以在插入时必须考虑以下三种情况:

?


B+树索引在数据库中有一个特点就是其高扇出性,因此在数据库中,B+树高度一般在2-3层,也就是寻找某一键值的行记录,最多2-3次IO,而一般的磁盘每秒至少可以做100次IO,2-3次的意味着查询时间只需0.02-0.03秒。

?

二、 聚集索引、非聚集索引

?

聚集索引与非聚集索引的区别是:页节点是否存放一整行记录

?

2.1 聚集索引

?

InnoDB存储引擎表是索引组织表,即表中数据按照主键顺序存放。而聚集索引就是按照每张表的主键构造一颗B+树,并且叶节点中存放着整张表的行记录数据,因此也让聚集索引的叶节点成为数据页。聚集索引的这个特性决定了索引组织表中的数据也是索引一部分。同时B+树数据结构一样,每个数据页都通过一个双向链表来进行链接。

?

?? 实际数据也只能按照一颗B+树进行排序,因此每张表只能拥有一个聚集索引。在许多情况下,查询优化器非常倾向于采用聚集索引,因为聚集索引能够让我们在索引的叶节点直接找到数据。此外,由于定义了数据的逻辑顺序,聚集索引能够快速地访问针对范围值得到查询。查询优化器