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,也可以将这些条件下推到索引层面上进行过滤,从而减少回表的次数和范围。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一码归一码@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值