mysql索引的数据结构及工作机制

一、索引数据结构的选择

我们知道索引可以加快数据的查询速度,索引之所以能加快数据的查询速度,是因为mysql服务器在数据文件之外专门建立了一种有助于加快查询速度的数据结构,这个数据结构就叫索引。通常索引文件也很大,而且索引一般有持久化要求,所以一般将索引数据结构以一定的形式存储在磁盘中,当mysql查询优化器确定需要使用某个索引时,再将索引从磁盘导入内存。我们知道磁盘读写涉及外存IO操作,一般外存IO操作很耗时间,这就和索引的本义相违背。所以在索引数据结构的选择上,磁盘IO次数是一个决定性的因素。这也是索引数据结构一般采用B-Tree或者B+Tree而不采用二叉树的原因。

二、B-Tree与B+Tree

如下图所示,是一颗B-Tree,B-Tree有两个核心参数:d和h。其中d称为树的度,h称为树高。

图-1(引自博客:http://blog.jobbole.com/24006/)

B-Tree的特性包括:

1、节点包含叶子节点和非叶子节点,每个节点以指针和键值对交错排列,每个节点内的Key值以非递减排列。当节点是叶子节点时,其中的指针全部为空;当节点是非叶子节点时,其中的指针要么为空,要么指向下一级节点。最左侧指针指向的节点,其中的Key值小于或者等于其父级节点的Key值;最右侧指针指向的节点,其中的Key值大于或者等于其父级节点的Key值。

2、节点内的指针数和键值对数取决于数的度,每个节点最多包含2d-1个键值对和2d个指针,最少包含d-1个键值对和d个指针。

3、所有的叶子节点在同一层

我们知道,程序数据访问一般遵从局部性原理,所谓局部性原理是指,当程序访问某个数据时,往往在接下来的时间里访问该数据的临近数据。所以当从磁盘加载某个数据时,一般会将该数据附近的数据以一个数据块的方式一起加载进来。数据库的设计者巧妙了利用了这一特性,一般将B-Tree的度设成一个很大的数字,一次加载进来一个节点的数据,理论上讲查询某个数据需要的磁盘IO次数就是树的高度。

二叉树一个节点只包含一个键值对和两个指针,而且Key值相近的节点在树上的分布可能较远,要查询某个数据,磁盘IO次数可能会比较多。

三、mysql索引注意事项

1、在区分度比较小的列上建索引可能并不会加快查询的速度,因为创建出来的B-Tree节点数非常有限,查询的工作集中在节点内的遍历。

2、一次单表查询只会使用一个索引,mysql优化器会择优使用某个索引,不会两个索引同时使用。

你可能感兴趣的:(mysql索引的数据结构及工作机制)