主键索引
mysql会为主键自动创建主键索引,InnoDB存储引擎采用B+树来创建索引,其非叶子节点只包含索引列(主键),叶子节点包含索引列(主键)和数据,主键索引为聚簇索引。
二级索引
二级索引的非叶子节点存储的是索引列(创建索引的字段值),叶子节点存储的索引列和主键值,二级索引为非聚簇索引,当我们使用二级索引时,如果没有覆盖索引,则需要先找到对应的主键,在到主键索引里面进行回表查找
注:
● 聚簇索引是一种数据的存储方式,即索引和数据存放在一起,并不是一种单独的索引类型,因此主键索引属于聚簇索引,二级索引不属于聚簇索引
● 覆盖索引即我们需要查询的列刚好是索引包含的列,那么找到该索引列就相当于查到了数据,因此无需回表
举个栗子
上图表示在user表的b,c,d三个列创建了联合索引,那么索引树里各个节点存储的索引列值为b,c,d三个列的值(如111, 222)
select * from user where b=1 and c=1
上方语句where
后面的条件符合最左前缀匹配原则(b在最前面),因此能走索引,其会从联合索引树的根节点出发,一层层向下找,直到定位到索引列包含b=1及c=1的叶子节点。但此时定位到的索引列只有b,c,d三个列的值,而我们需要查询所有字段值,因此不是覆盖索引,需要回表。
回表即用该叶子节点存储的主键值到主键索引中进行查找。从主键索引树的根节点一层层向下查找到对应主键值的叶子节点,也就能取到该叶子节点包含的数据
推荐文章
一文讲清,MySQL中的二级索引
文中图片转自MySQL索引之道