InnoDB中的B+树索引和哈希索引

B+树索引

能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点中进行搜索。最终存储引擎要么找到对应的值,要么该记录不存在。(b+树的叶子节点中存有索引值所在行的行号)

建立在B+树上面的索引

B+树索引的查询类型

B-Tree索引适用于全键值、键值范围或键前缀查找其中键前缀查找只适用于根据最左前缀的查找。

全值匹配

全值匹配指的是和索引中的所有列进行匹配,例如前面提到的索引可用于查找姓名为CubaAllen、出生于1960-01-01的人。

匹配最左前级

前面提到的索引可用于查找所有姓为Allen的人,即只使用索引的第一列。匹配列前级也可以只匹配某一列的值的开头部分。例如前面提到的索引可用于查找所有以J开头的姓的人。这里也只使用了索引的第一列。

匹配范围值

例如前面提到的索引可用于查找姓在Allen和Barrymore之间的人。这里也只使用了索引的第一列。

精确匹配呆一列并范围匹配另一列

扫描二维码关注公众号,回复: 5977110 查看本文章

前面提到的索引也可用于查找所有姓为Allen,并且名字是字母K开头(比如Kim、Karl等)的人。即第一列last_name全匹配,第二列first_name范围匹配。

只访问索引的查询

B-Tree通常可以支持“只访问索引的查询”,即查询只需要访问索引,而无须访问数据行。后面我们将单独讨论这种“覆盖索引”的优化。

因为索引树中的节点是有序的,所以除了按值查找之外,索引还可以用于查询中的ORDERBY操作(按顺序查找)。一般来说,如果B-Tree可以按照某种方式查找到值,那么也可以按照这种方式用于排序。所以,如果ODERBY子句满足前面列出的几种查询类型,则这个索引也可以满足对应的排序需求。

哈希索引 

哈希索引是基于哈希表实现的,只有精确匹配索引所有列的查询才有效。

hash索引的特点


1、hash索引是基于hash表实现的,只有查询条件精确匹配hash索引中的所有列的时候,才能用到hash索引。

2、对于hash索引中的所有列,存储引擎都会为每一行计算一个hash码,hash索引中存储的就是hash码。

3、hash索引包括键值、hash码和指针 。

  因为hash索引本身只需要存储对应的hash值,所以索引的结构十分紧凑,这也让hash索引查找的速度非常快。然而,hash索引也是存在其限制的:

hash索引的限制


1、Hash索引必须进行二次查找 
  使用哈市索引两次查找,第一次找到相应的行,第二次读取数据,但是被频繁访问到的行一般会缓存在内存中,这点对数据库性能的影响不大。 
   
2、hash索引不能用于外排序 
  hash索引存储的是hash码而不是键值,所以无法用于外排序 
   
3、hash索引不支持部分索引查找也不支持范围查找 
  只能用到等值查询,不能范围和模糊查询 
   
4、hash索引中的hash码的计算可能存在hash冲突 
  当出现hash冲突的时候,存储引擎必须遍历整个链表中的所有行指针,逐行比较,直到找到所有的符合条件的行,若hash冲突很多的话,一些索引的维护代价机会很高,所以说hash索引不适用于选择性很差的列上(重复值很多)。姓名、性别、身份证(合适) 
   
  上面说到InnoDB的“自适应hash索引”。就是当InnoDB注意到某些索引值被使用的非常频繁时,它会在内存中基于B-Tree索引上在创建一个hash索引,这样就让B-tree索引也具有hash索引的一些优点。这是一个完全自动的内部的行为,用户无法控制或配置,不过,如果有需要,完全可以关闭该功能。
 

猜你喜欢

转载自blog.csdn.net/qfc8930858/article/details/89439073