文章目录

  • 五分钟告诉你什么是MySQL的覆盖索引
    • 覆盖索引
    • 总结
    • 参考

五分钟告诉你什么是MySQL的覆盖索引

前面我们已经对MySQL索引底层原理多少有一定的了解了,还不是很了解的小伙伴可以看我之前的博文:《不会吧不会吧,难道还有人不了解MySQL索引底层原理?》 和 《MySQL底层为什么要选用B+树作为索引的数据结构呢?》

其实在之前的博文中也提到了覆盖索引啦,然后今天就单独把这个拿出来讲一讲这个MySQL的性能优化: 覆盖索引。

覆盖索引

覆盖索引:SQL只需要通过索引就可以返回查询所需要的数据,而不必通过二级索引查到主键之后再去查询数据。

首先要了解覆盖索引之前,你必须要了解什么是聚簇索引和非聚簇索引,对这个不了解的小伙伴可以看我之前的博文,还有一个必须要了解的就是回表,覆盖索引其实就是跟到底需不需要回表有直接的关系的。

什么是回表呢? 通俗的讲就是,如果索引的列在 select 所需获得的列中 或者根据一次索引查询就能获得记录就不需要回表,如果 select 所需获得列中有大量的非索引列,索引就需要到表中找到相应的列的信息,这就叫回表。只有非聚簇索引是需要回表的,所以如果你懂得非聚簇索引的存储的结构,你自然就知道为啥需要回表了。

注意:不是所有类型的索引都可以成为覆盖索引。覆盖索引必须要存储索引的列,而哈希索引、空间索引和全文索引等都不存储索引列的值,所以MySQL只能使用B-Tree索引做覆盖索引

我这里举一个例子你就可以很快明白了。

create table t1
(a int primary key ,b int,c int,d int,e varchar(20)
)engine=InnoDB;insert into t1 value (4, 3, 1, 1, 'd');
insert into t1 value (1, 1, 1, 1, 'a');
insert into t1 value (8, 8, 8, 8, 'h');
insert into t1 value (2, 2, 2, 2, 'b');
insert into t1 value (5, 2, 3, 5, 'e');
insert into t1 value (3, 3, 2, 2, 'c');
insert into t1 value (7, 4, 5, 5, 'g');
insert into t1 value (6, 6, 4, 4, 'f');create index idx_t1_bcd on t1(b,c,d); -- 创建复合索引

接下来我们来看这些SQL,看看哪些SQL满足了覆盖索引。

explain select * from t1 where b = 1; -- 回表
explain select e from t1 where b = 1; -- 回表
explain select b from t1 where b = 1; -- 不用回表 Using index  覆盖索引
explain select b,c from t1 where b = 1; -- 不用回表 Using index  覆盖索引
explain select b,d from t1 where b = 1; -- 不用回表 Using index  覆盖索引
explain select b,c,d from t1 where b = 1; -- 不用回表 Using index  覆盖索引
explain select a,b,c,d from t1 where b = 1; -- 不用回表 Using index  覆盖索引

其实上面已经给出答案了。

我们通过执行计划就可以知道是不是满足了覆盖索引的条件了。

如果Extra使用了Using index,就说明了他是满足了覆盖索引了,这个就是覆盖索引的标志了。

而下面这种很明显就是不满足索引覆盖了。

因为我们建立的是复合索引,所以就是非聚簇索引,非聚簇索引的叶子节点上会存放键的值,也就是我们的(b,c,d) 这三个字段,还会存放主键a字段用于回表操作。

所以只要查询的列是你建立的索引字段再加上主键字段,都是满足索引覆盖的,这个时候我们在非聚簇索引的叶子节点就能给够获取到这些数据,不需要回表操作。

总结

如果要使用覆盖索引,一定要注意SELECT 列表值取出需要的列(并且这些列是有索引的),不可以是SELECT *,但有的人说可以全部列都加索引,但如果将所有字段一起做索引会导致索引文件过大,查询性能下降,不能为了利用覆盖索引而这么做。

参考

回表与覆盖索引,索引下推

mysql高效索引之覆盖索引

什么叫做覆盖索引?

五分钟告诉你什么是MySQL的覆盖索引相关推荐

  1. mysql的覆盖索引原理_「Mysql索引原理(七)」覆盖索引

    通常大家都会根据查询的WHERE条件来创建合适的索引,不过这只是索引优化的一个方面.设计优秀的索引应该考虑到整个查询,而不单单是WHERE条件部分.索引确实是一种查找数据的高效方式,但是MySQL也可 ...

  2. MySQL 的覆盖索引与回表

    一.两大类索引 聚簇索引: 如果表设置了主键,则主键就是聚簇索引 如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索引 以上都没有,则会默认创建一个隐藏的row_id ...

  3. mysql覆盖数据_理解MySQL数据库覆盖索引

    话说有这么一个表: CREATE TABLE`user_group` ( `id`int(11) NOT NULLauto_increment, `uid`int(11) NOT NULL, `gro ...

  4. mysql创建存储时覆盖_总结到位的MySQL 的覆盖索引与回表

    两大类索引 使用的存储引擎:MySQL5.7 InnoDB 聚簇索引 * 如果表设置了主键,则主键就是聚簇索引 * 如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索 ...

  5. MySQL 的覆盖索引为什么不需要回表

    结论:innodb二级索引(非聚餐索引)除了存储id外还是存储了对应字段的数据的,所以覆盖索引不需要回表 参考联合索引最左匹配原则,根据字段出现的顺序排序的 以下内容来源地址:https://zhua ...

  6. mysql 数据库被覆盖_理解MySQL数据库覆盖索引

    话说有这么一个表: CREATE TABLE `user_group` ( `id` int(11) NOT NULL auto_increment, `uid` int(11) NOT NULL, ...

  7. MySQL 的覆盖索引的实现

    两大类索引 使用的存储引擎:MySQL5.7 InnoDB 聚簇索引 * 如果表设置了主键,则主键就是聚簇索引 * 如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索 ...

  8. mysql 创建覆盖索引_MySql覆盖索引

    mysql的innodb引擎通过搜索树方式实现索引,索引类型分为主键索引和二级索引(非主键索引),主键索引树中,叶子结点保存着主键即对应行的全部数据:而二级索引树中,叶子结点保存着索引值和主键值,当使 ...

  9. MySQL使用覆盖索引来优化limit语句

    使用MySQL官方提供的测试数据库sakila来进行测试: USE sakila; explain select * from rental limit 10000,5; explain select ...

最新文章

  1. 设计模式C#描述——抽象工厂模式
  2. 关于微服务的7个疑问和解答!
  3. 禁止服务器的协议,Windows 服务器禁用 SSL 2 和 SSL 3 协议
  4. kodi android设置中文,Kodi(原XBMC)
  5. linux里面启用无线网卡,linux启用无线网卡上网
  6. Spring Data JPA 从入门到精通~JpaSpecificationExecutor示例
  7. 案例 网络电视精灵 c# 1614265410
  8. MiniGUI编程--静态框[转]
  9. c# image转换为bitmap,C# - 转换WPF Image.source到System.Drawing.Bitmap
  10. .Net框架集WebClient类向WinCE平台上传文件(FTP方式)延迟15秒释疑
  11. 多媒体查询@media
  12. mysql mariadb不能启动原因_MySQL(MariaDB)无法启动
  13. mysql查询结果做表_MySQL将一个表的查询结果作为本表的查询条件更新数据
  14. Android 补间动画(二)
  15. 中图分类法---- U 交通运输
  16. Qualcomm MPM introduction
  17. 如何将mov格式转换成mp4并且不改变分辨率
  18. 题解 P2342 【叠积木】
  19. 数据分析新人如何面对繁杂且突然的数据需求
  20. Objective-C 【对象-多文件开发简介】

热门文章

  1. iOS备忘录之本地数据详解
  2. VUE如何进行微信定位(使用微信JSSDK)
  3. what make us roomates-兰存福
  4. Mac下nginx启动命令
  5. 奇瑞、华为联手打造高端智电品牌,首款B级轿车2023年上市
  6. 以Echo为例,从锂矿厂到数据矿厂的人工智能产业全景地图是这样的
  7. 计算机主机光驱弹不出来怎么办,电脑光驱弹不出来的解决方法
  8. es日期format_es-sql – 版本5.6.3 – date_format 查询时间格式化使用说明
  9. TREK1000概述--实时定位系统
  10. Arcmap数据合并