MySQL索引

12年前
索引(index)是帮助MySQL高效获取数据的数据结构,是现实中性能问题的首要问题。

索引类型

B-Tree索引

B-Tree意味着数据存储是有序的,并且每个叶子页到根的距离是一样的。B-Tree索引加速了数据访问,因为存储引擎不会扫描整个表得到需要的数据。而是从根节点开始进行树查找。因为B-Tree按顺序保存了索引的列,它们对于搜索范围数据很有用。

能使用B-Tree索引的查询类型

B-Tree索引能很好地用于全键值、键值范围或键前缀查找。

B-Tree索引的一些局限

如果查找没有从索引列的最左边开始,他就没有用处。

不能跳过索引中的列。

存储引擎不能优化访问任何在第一个范围条件右边的列。

哈希索引(Memory引擎)

哈希索引建立在哈希表的基础上,它只对使用了索引中的每一列的精确查找有用。对于每一行,存储引擎计算出了被索引列的哈希码,它是一个比较小的值,并且有可能和其它行的哈希码相同。它把哈希码保存在索引中,并且保存了一个指向哈希表中每一行的指针。

哈希索引的一些局限

因为索引只包含了哈希码和行指针,而不是值自身,MySQL不能使用索引中的值来避免读取行。幸运的是,访问内存中的行很快,因此这通常不会降低性能。

MySQL不能使用哈希索引进行排序,因为它们不会按序保存行。

哈希索引不支持部分键匹配,因为它们是由被检索的全部值计算出来的。

哈希索引只支持使用了=、IN()、和<=>的相等比较,不能加快范围查询。(注意<>和<=>不是相同的运算符)

访问哈希索引中的数据非常快,除非碰撞率非常高。当发生碰撞的时候,存储引擎必须访问链表中的每一个行指针,然后逐行进行数据比较,以确定正确的数据。

InnoDB存储引擎有一个特别的功能,叫自适应哈希索引。当InnoDB注意到一些索引值被频繁访问的时候,它就回在B-Tree的顶端为这些值建立内存中的索引。