MySQL索引

2020/11/27 posted in  索引

1. B-Tree索引

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

使用B+树结构存储数据

特点

  1. B-Tree 索引能够加快数据的查询速度
  2. 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)
    );

IMG_3047

索引中对多个值进行排序依据是CREATE TABLE 语句中定义索引时列的顺序。
可以使用B-Tree索引的查询类型,适用于全键值,键值范围,键前缀查找。

  1. 全值匹配查询:和索引中全部列进行匹配。
order_no = '123123'
  1. 匹配最左前缀查询 : 索引的第一列

  2. 匹配列前缀 : 某一列的最开头部分

order_no like '123123' 
  1. 范围值的查询 :使用索引第一列的值
  2. 精确匹配某一列并范围匹配另一列:第一列的全值匹配,第二列的范围匹配
  3. 只访问索引的查询:查询只需要访问索引,不需要访问数据行

注意 :B-Tree 如果能按照某种方式查询到值,那么它也可以按照这种方式用于排序,如果Order By 子句满足前面提出的几种查询类,那么这个索引也可以满足对应的排序需求

使用限制

  1. 如果不是按照索引最左列开始查找,则无法使用索引
  2. 使用索引时不能跳过索引中的列
  3. NOT IN 和 <> 操作不能使用索引
  4. 如果查询中有某个列使用范围查询,则其右所有的列都无法使用索引

2. Hash索引

特点

  1. Hash索引是基于Hash表实现的,只有查询条件精确匹配,Hash索引中的所有列时,才能够使用到Hash索引
  2. 对于Hash索引中的所有列,存储引擎都会为每一行计算一个Hash码,Hash索引中存储的就是Hash码

限制

  1. Hash索引只包含哈希值和行指针,而不存储字段值必须进行二次查询
  2. Hash索引不是按照索引值顺序存储的所以无法用于排序
  3. Hash索引不支持部分索引查找和范围查找
  4. Hash索引中的Hash的计算可能存在Hash冲突

为什么使用索引

  1. 索引大大减少了存储引擎扫描的数据量
  2. 索引可以帮助我们进行排序避免使用临时表
  3. 索引可以把随机的I/O变为顺序I/O

索引缺点

  1. 索引会增加写操作的成本
  2. 太多的索引会增加查询优化器的选择时间