mysql索引的实现原理

来源:互联网 发布:积分商城数据库设计 编辑:程序博客网 时间:2024/06/06 00:22

索引是一种为了帮助数据库系统高效获取数据而由其维护着的满足特定查找算法的数据结构

节点的度:一个节点含有的子树的个数称为该节点的度;

树的度:一棵树中,最大的节点的度称为树的度;
叶节点或终端节点:度为零的节点;
非终端节点或分支节点:度不为零的节点;

首先从根节点进行二分查找,如果找到则返回对应节点的data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或找到null指针,前者查找成功,后者查找失败.

B-Tree上查找算法的伪代码如下:

BTree_Search(node, key) {    if(node == null) return null;    foreach(node.key)    {        if(node.key[i] == key) return node.data[i];            if(node.key[i] > key) return BTree_Search(point[i]->node);    }    return BTree_Search(point[i+1]->node);}data = BTree_Search(root, my_key);

性质:度为d 索引为N个 则其树高h的上限为 logd((N+1)/2)。 检索一个key,其查找节点个数的渐进复杂度为 O(logdN)

插入删除新的数据记录会破坏B-Tree的性质,因此在插入删除时,需要对树进行一个分裂、合并、转移等操作以保持B-Tree性质。

Mysql一般采用B+Tree
与B-Tree相比,B+Tree有以下不同点:
每个节点的指针上限为2d而不是2d+1。
内节点不存储data,只存储key;叶子节点不存储指针。

在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。
叶节点的data域存放的是数据记录的地址,内节点的作用是导航。

效率问题。
如果要查询key为从18到49的所有数据记录,当找到18后,只需顺着节点和指针顺序遍历就可以一次性访问到所有数据节点,极大提到了区间查询效率。

逐渐的问题:
如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键。

最左前缀原理:
MySQL的查询优化器会自动调整where子句的条件顺序以使用适合的索引。

如果通配符%不出现在开头,则可以用到索引。

BETWEEN实际上相当于IN

不建议建索引

  1. 表记录比较少(2000以下)
    选择性越高的索引价值越大,这是由B+Tree的性质决定的
SELECT count(DISTINCT(title))/count(*) AS Selectivity FROM employees.titles;

复合索引的选择性(concat)

参考文章:
1. http://blog.codinglabs.org/articles/theory-of-mysql-index.html