1. B-Tree索引
B-Tree 索引从根节点开始搜索,根节点的槽中存放了指向子节点的指针,存储引擎根据这些节点向下查询

使用B+树结构存储数据
特点
- B-Tree 索引能够加快数据的查询速度
- B-Tree索引更适合进行范围查找
适用场景
CREATE TABLE People (
last_name varchar(50) not null,
first_name varchar(50) not null,
dob date bot null,
gender enum('m', 'f') not null,
key(last_name,first_name,dob)
);

索引中对多个值进行排序依据是CREATE TABLE 语句中定义索引时列的顺序。
可以使用B-Tree索引的查询类型,适用于全键值,键值范围,键前缀查找。
- 全值匹配查询:和索引中全部列进行匹配。
order_no = '123123'
-
匹配最左前缀查询 : 索引的第一列
-
匹配列前缀 : 某一列的最开头部分
order_no like '123123'
- 范围值的查询 :使用索引第一列的值
- 精确匹配某一列并范围匹配另一列:第一列的全值匹配,第二列的范围匹配
- 只访问索引的查询:查询只需要访问索引,不需要访问数据行
注意 :B-Tree 如果能按照某种方式查询到值,那么它也可以按照这种方式用于排序,如果Order By 子句满足前面提出的几种查询类,那么这个索引也可以满足对应的排序需求
使用限制
- 如果不是按照索引最左列开始查找,则无法使用索引
- 使用索引时不能跳过索引中的列
- NOT IN 和 <> 操作不能使用索引
- 如果查询中有某个列使用范围查询,则其右所有的列都无法使用索引
2. Hash索引
特点
- Hash索引是基于Hash表实现的,只有查询条件精确匹配,Hash索引中的所有列时,才能够使用到Hash索引
- 对于Hash索引中的所有列,存储引擎都会为每一行计算一个Hash码,Hash索引中存储的就是Hash码
限制
- Hash索引只包含哈希值和行指针,而不存储字段值必须进行二次查询
- Hash索引不是按照索引值顺序存储的所以无法用于排序
- Hash索引不支持部分索引查找和范围查找
- Hash索引中的Hash的计算可能存在Hash冲突
为什么使用索引
- 索引大大减少了存储引擎扫描的数据量
- 索引可以帮助我们进行排序避免使用临时表
- 索引可以把随机的I/O变为顺序I/O
索引缺点
- 索引会增加写操作的成本
- 太多的索引会增加查询优化器的选择时间
