索引策略(索引方法)

玩过Navicat for MySQL的都应该知道这张图,这里的索引方法指的就是索引的策略。主要有两种方式,一种是Btree,一种是Hash。

这里写图片描述

  • B-tree索引

注: 名叫btree索引,大的方面看,都用的平衡树,但具体的实现上, 各存储引擎稍有不同,比如,严格的说,NDB引擎,使用的是T-tree
Myisam,innodb中,默认用B-tree索引,B-tree的理论查询时间复杂度为O(log2 (N-1)),N为数据表的行数

  • hash索引
    使用memory存储引擎的表中,默认是hash索引, hash的理论查询时间复杂度为O(1)

既然hash的查找如此高效,为什么不都用hash索引?

(1)hash函数计算后的结果,是随机的,如果是在磁盘上放置数据,以主键为id为例, 那么随着id的增长, id对应的行,在磁盘上随机放置。
(2)无法对范围查询进行优化
(3)无法利用前缀索引。比如在btree中, field列的值“helloworld”,并加索引,查询 xx=helloword,自然可以利用索引, xx=hello,也可以利用索引. (左前缀索引),因为hash(‘helloworld’),和hash(‘hello’),两者的关系仍为随机,所以无法利用前缀索引
(4)排序也无法优化.
(5)必须回行.就是说通过索引拿到数据位置,必须回到表中取数据

原文地址:https://www.cnblogs.com/cnsec/p/13407021.html