美文网首页Java笔试面试MySQL数据库
Mysql的聚集索引与辅助索引

Mysql的聚集索引与辅助索引

作者: 小北觅 | 来源:发表于2018-09-28 23:30 被阅读284次

Mysql数据库中的B+树索引可以分为聚集索引和辅助索引(非聚集索引)。本文将介绍一下两者。

聚集索引

聚集索引:指索引项的排序方式和表中数据记录排序方式一致的索引(这里不懂先放着,一会举例),每张表只能有一个聚集索引,聚集索引的叶子节点存储了整个行数据。

解释:什么叫索引项的排序方式和表中数据记录排序方式一致呢?
我们把一本字典看做是数据库的表,那么字典的拼音目录就是聚集索引,它按照A-Z排列。实际存储的字也是按A-Z排列的。这就是索引项的排序方式和表中数据记录排序方式一致。

对于Innodb,主键毫无疑问是一个聚集索引。但是当一个表没有主键,或者没有一个索引,Innodb会如何处理呢。请看如下规则:

  • 如果一个主键被定义了,那么这个主键就是作为聚集索引。
  • 如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引。
  • 如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,该列的值会随着数据的插入自增。

辅助索引

辅助索引:辅助索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。叶子节点并不包含行记录的全部数据。叶子节点除了包含键值以外,还存储了一个指向改行数据的聚集索引建的书签。

辅助索引可以理解成字典按偏旁去查字。

借幅图举例子,图来自https://www.cnblogs.com/s-b-b/p/8334593.html

image.png

我们直接看B+树的Leaf Level中的叶节点,只存放了辅助索引那列的数据,并不包含整个行的数据,但是他后面存放了一个“指针”,比如黄色的Rudd,后面存的是4:705:01,代表完整的行记录在第705页的第一条记录。

所以非聚集索引有二次查询的问题:
非聚集索引叶节点仍然是索引节点,只是有一个指针指向对应的数据块,因此如果使用非聚集索引查询,而查询列中包含了其他该索引没有覆盖的列,那么他还要进行第二次的查询,查询节点上对应的数据行的数据。

如何解决非聚集索引二次查询的问题:
建立两列以上的索引,即可查询复合索引里的列的数据而不需要进行回表二次查询,如index(col1, col2),执行下面的语句:

select col1, col2 from t1 where col1 = '213';

因为复合索引的列包括了col1和col2,不需要查询别的列,所以不需要进行二次查询。

要注意使用复合索引需要满足最左侧索引的原则,也就是查询的时候如果where条件里面没有最左边的一到多列,索引就不会起作用。(看不懂的话后面讲)

通俗的讲讲最左索引原则吧:
假设创建了复合索引index(A,B,C),那么其实相当于创建了如下三个组合索引:
index(A,B,C)
index(A,B)
index(A)
这就是最左索引原则,就是从最左侧开始组合。

所以说如果查询的时候,where语句没有最左边的一列或多列,就不会使用建立的索引去查询。

参考资料:
https://www.cnblogs.com/s-b-b/p/8334593.html

相关文章

  • Mysql的聚集索引与辅助索引

    Mysql数据库中的B+树索引可以分为聚集索引和辅助索引(非聚集索引)。本文将介绍一下两者。 聚集索引 聚集索引:...

  • mysql索引(三)聚集索引与非聚集索引(辅助索引)

    Mysql中常用的两个存储引擎innodb和mysiam的索引是不同的。 聚集索引就是以主键创建的索引 非聚集索引...

  • 聚集索引与辅助索引

    数据库中的B+树索引可以分为聚集索引 (clustered index) 和辅助索引 (secondary ind...

  • Day07-SQL存储引擎

    上节回顾 1. 聚集索引与辅助索引的区别?(面试题) 聚集索引构建B树过程(面试题) 辅助索引构建B树过程(面试题...

  • 索引及执行计划

    1 索引作用与分类 2 索引 B树 3.功能上区分 辅助索引与聚集索引的区别 辅助索引的划分 关于索引树的高度受什...

  • 聚集索引 - 辅助索引

    索引(Index)是帮助MySQL高效获取数据的数据结构。 MyISAM索引实现 MyISAM引擎使用B+Tree...

  • MySQL索引

    MySQL索引 索引介绍 索引原理与分析 组合索引 索引失效分析 索引介绍 什么是索引索引:包括聚集索引、覆盖索引...

  • B树与索引

    目录 一, 索引与B树介绍 1. B树 ,B+树 ,B*树 2. 聚集索引 3. 辅助索引 3.1 普通辅助索引3...

  • B树与索引

    目录 一, 索引与B树介绍 1. B树 ,B+树 ,B*树 2. 聚集索引 3. 辅助索引 3.1 普通辅助索引3...

  • 避免回表与覆盖索引

    为什么要避免回表 mysql维护着两种索引树:聚集索引、非聚集索引。我们建立的索引都属于非聚集索引。通过非聚集索引...

网友评论

  • 大南找:最左索引原则意思是如果where语句中没有A,那么这条语句将不会查询?是这样吗?
    小北觅:@大南找 其实就是一行数据嘛,只不过一行上的其他列没有值。
    大南找:@小北觅 噢噢,那就是用普通的查询?非聚集索引的二次查询感觉有点抽象,叶子节点中包含该索引尚未覆盖的列 是个什么样子的呢?为什么是列不是行?
    小北觅:@大南找 不是,是不会使用索引查询

本文标题:Mysql的聚集索引与辅助索引

本文链接:https://www.haomeiwen.com/subject/lltpoftx.html