Mysql索引基础篇:什么是聚簇索引什么是非聚簇索引、索引的最左前缀原则、索引下推、索引覆盖、回表

文章目录

  • 前言
  • 索引的类型
  • 什么是聚簇索引什么是非聚簇索引
  • 什么是索引的最左前缀原则
  • 索引覆盖
  • 回表
  • 索引下推

前言

索引是一种特殊的数据库结构,有数据表中的一列或者多列组合而成,可以快速查询数据表中的值,相当于图书的目录,根据目录的页码快速找到所需内容。创建索引可以大幅提高系统性能,帮助用户提高查询的速度、可以加速表与表之间的链接、降低查询中分组和排序的时间。索引是把双刃剑既有好也有坏,索引的存储需要占用磁盘空间、当数据的量非常巨大时,索引的创建和维护所耗费的时间也是相当大的、当每次执行create、update、delete操作时,索引也需要动态维护,降低了数据的维护速度。

索引的类型

常用的索引有主键索引、唯一索引、普通索引、组合索引、前缀索引。
主键索引

alter table 表名 add primary key(列名);
alter table order add primary key(`id`);

唯一索引

alter table 表名 add unique index 索引名(列名);
alter table order add unique index index_id_card(`order_id`);

普通索引

alter table 表名 add index 索引名(列名);
alter table order add index index_name(`commodity_id`);

联合索引

alter table 表名 add index 索引名(列名1,列名2.......);
alter table order add index index_age_name(`type`,`business`,`create_date`);

前缀索引

alter table 表名 add index 索引名(列名(长度));
alter table order add index index_address(order_no(8));

什么是聚簇索引什么是非聚簇索引

Mysql中若没有创建主键则会选取表中唯一索引作为聚簇索引,若没有唯一索引就会创建一个隐藏的rowid去构建聚簇索引,在mysql中若查询到数据在某一个叶子节点中就会把整个节点的数据加载到Cache Pool中,聚簇索引就是叶子节点携带了整行的数据。而非聚簇索引就比如联合索引,联合索引中只存在联合索引的几个字段的数据以及主键id,并没有完全包含整行数据。

什么是索引的最左前缀原则

在联合索引中有三个字段分别为A、B、C,当一条查询语句用到了联合索引时,若条件字段只用到B则不会使用索引,A的整体是有序的,而B是相对于A有序的,C是相对B有序的,索引是一个排好序的数据结构,若只用B不用A,那么这个排序则会失效。本身A是全局有序,而B、C只是相对有序,只有等A索引的值匹配后进行索引下推才能查到对应的数据。

索引覆盖

创建一个索引,该索引包含查询中用到的所有字段,只需要通过索引就可以查找和返回查询所需要的数据。可以一次性完成查询工作,有效减少IO,提高查询效率。

回表

通过二级索引查找到主键ID,然后在通过主键ID去查询聚簇索引找到一行的完整数据。
所以回表的产生也是需要一定条件的,如果一次索引查询就能获得所有的select 记录就不需要回表,如果select 所需获得列中有其他的非索引列,就会发生回表动作。即基于非主键索引的查询需要多扫描一棵索引树。

索引下推

索引下推是指在使用联合索引时,将过滤条件下推到索引层,从而减少回表的次数。例如,假设我们有一个订单表,包含了订单的id,用户id,商品id,价格等字段,我们想要查询所有用户id为1且价格大于1000的订单的商品id和价格,那么我们可以创建一个包含了用户id,价格和商品id的联合索引,这样在扫描索引时就可以先过滤掉不满足用户id为1或价格大于1000的记录,而不需要回表查询订单表。

与联合索引不同的是,联合索引只能在查询条件中包含索引的前缀部分时才能生效,而索引下推可以在查询条件中包含任意部分的索引时生效。 例如,如果一个联合索引是(a,b,c),那么只有当查询条件中包含a或者a和b时才能使用该索引,而如果查询条件中只包含b或者c时则不能使用该索引。 但是如果使用了索引下推,那么即使查询条件中只包含b或者c,也可以将这些条件下推到索引层面上进行过滤,从而减少回表的次数和范围。

你可能感兴趣的:(数据库,mysql,数据库)