InnoDB B+树索引

InnoDB存储引擎是索引组织表,也就是说数据文件本身就是按照B+树方式存放数据的。其中,B+树的键值为主键,若在建立的时候没有显式地指定主键,
则InnoDB存储引擎会自动创建一个6字节的列作为主键。因此在InnoDB存储引擎中,可以将B+树索引分为聚集索引和辅助索引,无论何种索引,每个页的大
小都为16KB。

聚集索引

聚集索引是根据主键创建的一棵B+树,聚集索引的叶子节点存放了表中的所有记录。

辅助索引

辅助索引是根据索引键创建的一棵B+树,与聚集索引不同的是,其叶子节点仅存放索引键值,以及该索引键值指向的主键。也就是说,如果说通过辅助索引来查找数据,那么,当找到辅助索引的叶子节点后,很有可能还需要根据主键值查找聚集索引来得到数据,这种查找方式又被称为“书签查找”。因为辅助索引不包含记录的所有数据,这就意味着每页可以存放更多的键值,因此其高度一般都要小于聚集索引。
93540504975535f465d1817d8bc631a.png

B+树索引的使用

不同应用中B+树的使用

OLTP:

查询操作只从数据库中取得一小部分数据,一般都10条以下,甚至一条,如根据订单id获取订单信息。在这种情况下,建立B+树索引后,对该索引的使用应该只是通过
该索引取得表中小部分的数据,这时建立B+树索引才是有意义的,否则即使建立了,优化器也可能选择不使用索引

OLAP:

OLAP应用中都需要访问大量的数据,并根据这些数据产生查询的结果,而这些查询多是面向分析的查询,目的是为决策者提供支持。因此,OLAP中添加索引依据的是宏观的信息而不是微观信息,这是因为最终要得到的结果是提供给决策者的。例如不需要在OLAP中对姓名字段进行索引,因为很少会对单个用户进行查询。但是对于OLAP中的复杂查询,需要涉及多张表之间的联接操作,这时索引的添加是有意义的。通常会需要对时间字段进行索引,这是因为大多数统计需要根据时间维度来进行判断。

联合索引

联合索引是指对表长得多个列进行索引。

  1. 示例:
  2. create table t(
  3. a int,
  4. b int,
  5. primary key(a),
  6. key idx_a_b(a,b)
  7. )ENGINE=INNODB

从本质上说,联合索引还是一棵B+树,不同的是联合索引的键值索引数量不是1,而是大于等于2。
907238ea6e175463e09be788e8d3497.png

键值都是排序的,通过叶子节点可以逻辑上顺序地读出所有数据。

  1. 对于查询 select * from t where a=xxx and b=xxx 显然是可以使用联合索引的
  2. 对于查询 select * from t where a=xxx 也是可以使用联合索引的
  3. 对于查询 select * from t where b=xxx 不可以使用此联合索引,可以看到叶子节点上b的值为121412,不是顺序的,因此不能使用(a,b)索引

联合索引的另一个好处:可以对第二个键值进行排序