1.聚集索引:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。
聚簇索引(聚集索引) :叶子节点包含整个行数据,每张表只能拥有一个聚簇索引
聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。
这个特性决定了索引组织表中数据也是索引的一部分。
Innodb通过主键聚集数据,如果没有定义主键,innodb会选择非空的唯一索引代替。如果没有这样的索引,innodb会隐式的定义一个主键来作为聚簇索引。
聚簇索引的优缺点
优点:
1.数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快
2.聚簇索引对于主键的排序查找和范围查找速度非常快
缺点:
1.插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键
2.更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新。
3.二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据
2.非聚集索引:普通,唯一,联合,全文
在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找(当需显示字段都在叶子节点时不需要二次查找(回表查询))(联合索引的叶子节点包含创建索引的联合字段)。
辅助索引叶子节点存储的不再是行的物理位置,而是当前索引字段+主键值。
通过辅助索引首先找到的是主键值,再通过主键值找到数据行的数据页,再通过数据页中的Page Directory找到数据行。
Innodb辅助索引的叶子节点并不包含行记录的全部数据,叶子节点除了包含键值外,还包含了相应行数据的聚簇索引键。
辅助索引的存在不影响数据在聚簇索引中的组织,所以一张表可以有多个辅助索引。在innodb中有时也称辅助索引为二级索引。
Innodb聚簇索引和MyIsam非聚簇索引的比较说明
参考博客:https://www.cnblogs.com/zlcxbb/p/5757245.html
MyISAM与InnoDB 索引区别:
-
innodb的主索引文件上 直接存放该行数据,称为聚簇索引,次索引指向对主键的引用
-
myisam中, 主索引和次索引,都指向物理行(磁盘位置).
MyISAM的是非聚簇索引,B+Tree的叶子节点上的data,并不是数据本身,而是数据存放的地址。主索引和辅助索引没啥区别,只是主索引中的key一定得是唯一的。这里的索引都是非聚簇索引。非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独立的地方,
这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键检索无需访问主键的索引树。InnoDB的数据文件本身就是索引文件,B+Tree的叶子节点上的data就是数据本身,key为主键,这是聚簇索引。聚簇索引,叶子节点上的data是主键(所以聚簇索引的key,不能过长)。
InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用"where id = 14"这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。若对Name列进行条件搜索,则需要两个步骤:第一步在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。
3.回表查询:
mysql普通索引查询时,在B+树叶子结点上只存放了当前字段和主键,所以涉及到其他字段的查询时需要从普通索引的叶子结点上查到的主键,再根据主键去查聚集索引,直至查到聚集索引的叶子结点(包含所有列信息)。
4.索引覆盖:
根据3中描述,不存在于普通索引叶子结点的字段需要回表查询;那么联合索引包含多个列信息,当select col1,col2...
col1 col2都包含在联合索引中时,普通索引(此时的联合索引)的叶子结点上就存在需要的列信息,此时不需要回表查询,称为索引覆盖
5.最左原则:
联合索引的索引树建立是根据最左侧的列值建立的,索引联合索引查询不规范容易失效:https://blog.csdn.net/weixin_43230063/article/details/102498302?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduend~default-1-102498302.nonecase
面试题:
1.非聚簇索引与聚簇索引的区别?
答:聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。
参考:
https://www.cnblogs.com/jiawen010/p/11805241.html