1、哈希索引
哈希索引(hash index)基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。
(1)Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。
(2)Hash 索引无法被用来避免数据的排序操作。
2、B-tree索引
B-tree索引更适合进行范围查询,B-tree对索引是顺序组织存储的,所以就很适合进行查找范围数据。
B-tree索引的使用场景
1、全值匹配的查询
指的是和索引中的所有列进行匹配,比如查询字段 name = ‘tom’;
2、匹配最左前缀的查询
比如为a列和b列设置联合索引,只要联合索引的第一列(a列)符合查询条件,索引就会被用到,若只是第二列(b列)符合条件则不会被用到该索引。
3、匹配列前缀的查询
只匹配某一列的值的开头部分
4、匹配范围值
5、精准匹配某一列并范围匹配另外一列
6、只访问索引的查询
在这里指的就是覆盖索引,即只需要访问索引,而无需访问数据行
7、用于查询中的order by 操作
索引树中的节点是有序的。一般来说,若B-Tree可以按照某种方式查找到该值,那么也可以用这种方式用于排序。所以,如果 order by 子句中满足前面列出的几种查询类型,则这个索引也可以满足对应的排序需求