MySQL 目前主要支持索引方法:B-Tree,Hash,R-Tree

B-Tree

B-Tree 是最常见的索引类型,所有的列都是排序过的,每个叶节点跟节点距离相等。因此,B-Tree 适合查找范围的数据,可以直接支持数据排序。

B-Tree 在 MyISANYO 中,索引文件是记录磁盘的地址;而在 InnoDB 中有索引,所以可以根据索引记录,直接找到叶节点的数据域。

Hash 索引

特点:

1.检索效率搞,索引的检索可以一次定位,不像 B-Tree 索引需要从根节点到枝节点,需要多次 IO 访问。

2.由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。因此,在任何时候都不能避免表扫描。

3.仅支持精确查询,例如:"=",“IN"和”<=>",不能使用范围查询:由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,无法判断返回,所以它只能用于等值的过滤,不能用于基于范围的过滤。

4.不支持排序:由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且 Hash 值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算。

5.只有 Memory 引擎支持显式的 Hash 索引,但是它的 Hash 是 nonunique 的,冲突太多时也会影响查找性能。Memory 引擎默认的索引类型即是 Hash 索引,虽然它也支持 B-Tree 索引

R-Tree 索引

R-Tree 在 MySQL 很少使用,仅支持 geometry 数据类型,支持该类型的存储引擎只有 MyISAM、BDb、InnoDb、NDb、Archive 几种。