索引都是在存储引擎层面实现的
1.BTREE索引
使用B-Tree数据结构创建的索引,索引值都是按顺序存放的,存储引擎不需要再全表扫描,取而代之的是从索引的根节点开始扫描,根节点存放了子节点的指针,随着向下层查找,随着查找值和节点值的比较(指针中右节点叶值的上下限),最终找到记录。
BTREE索引可以选择一个或者多个列作为索引。
create table test1(
one int not null;
two int not null;
three varchar(20) not null;
key(one,two,three)
);
注意:索引对多个值的排序依然是定时的顺序。
BTREE索引的查询类型:全值索引,匹配最左前缀(知识用多列中的一列),匹配列前缀(第一列中的前面若干字符),匹配范围值(第一类的某个范围之间),第一列全匹配第二列范围匹配,之访问索引部访问数据行。
注意:BTREE索引所有类型只能从第一列开始查找,而且无法用one和three但跳过two的索引,最后如果包含范围查询(like ’j%' ) 那么范围后的条件无法使用索引的性能优化。
2.哈希索引
基于哈希表的实现,存储引擎对每一行数据上索引的数据计算一个哈希码,并存储在索引中,同时哈希表保存指向每个数据行的指针,mysql中只有Memory支持哈希索引,如果有多个列的哈希值相同,索引以链表的形式存放多个记录指针到同一哈希条目或者叫桶中。
虽然哈希索引非常快,但是有如下限制:
1.索引只包含哈希值和行指针,不像btree存储具体数据行,所以不能使用索引避免读取行。
2.索引无法排序。
3.如果(a,b)在这两个列上建立哈希索引,如果查询时只用了a,则无法使用该索引,因为始终使用全部内容来计算的哈希值。
4.只支持等值比较运算(=,in(),<=>,)不支持范围查询。
5.哈希冲突(不同索引列有相同的哈希值)时,存储引擎只有遍历链条所有行指针进行比较。
6.哈希冲突很高,维护代价高。
3.全文索引
查找的是文本中的关键字,而不是比较索引值,更类似于搜索引擎的方法,相同列上创建全文索引和btree不会用冲突。