您现在的位置是:亿华云 > 域名
一分钟带你学会MySQL覆盖索引,让你的SQL更高效
亿华云2025-10-04 03:51:51【域名】0人已围观
简介覆盖索引是MySQL优化sql性能的一种非常重要而且常用的手段,通过覆盖索引,我们可以直接查询到需要的结果,而不用回表,从而大大减少树的搜索次数,非常明显的提升查询性能。数据如何存储与查找我们知道,M
覆盖索引是分钟覆盖MySQL优化sql性能的一种非常重要而且常用的手段,通过覆盖索引,索引我们可以直接查询到需要的更高效结果,而不用回表,分钟覆盖从而大大减少树的索引搜索次数,非常明显的更高效提升查询性能。
数据如何存储与查找
我们知道,分钟覆盖MySQL的索引数据都是存储在B+树上的,每一个索引都代表一个B+树。更高效
对于主键索引,分钟覆盖叶子节点存储的索引是一行记录的所有字段值(逻辑上),而非主键索引的更高效叶子节点存储的是主键值,非叶子节点存储的分钟覆盖是索引以及指向数据的指针。
那我们查询数据的索引时候,MySQL是高防服务器更高效如何执行的呢?
以主键索引为例,就是在主键索引树上,从根节点出发,一直向下查找,直到找到符合条件的记录。
如果我们要查下图中的User2节点,那么查找路径就是UserA->UserC->UserF->User2。
回表
只按照主键查询是一种理想中的状态,随着业务逐渐复杂,表中的字段会越来越多,我们也会建立更多的非主键索引以应对业务带来的挑战。
但是非主键索引会带来一个问题:回表。
以下面这条sql为例:
select * from t where m in (3,4);我们在表t的m字段上设置一个索引,那么这条sql的执行流程就是:
在索引树m上,找到记录3,获取到主键id,比如id=100;拿着100这个id去主键索引树上,获取到这一行的数据;在索引树m上,云服务器提供商找到记录4,获取到主键id,比如id=101;拿着101这个id去主键索引树上,获取到这一行的数据;在索引树上查找下一个记录5(不一定是5,这里的5只是代表记录4后面的一条记录),记录5不符合查询条件,结束查询。在上面的流程中,步骤2,4代表了回主键索引树搜索,这个动作就叫做回表。
而MySQL之所以做回表这个动作,是因为我们要查的数据 select *,只有在主键索引树上才有,所以不得不回表查询。
覆盖索引
如果我们把上面的sql改成下面这样:
select id from t where m in (3,4);这个时候只需要查询id就行,而id这个值已经在m索引树上了,这时就不用再回表了,可以直接提供查询结果。
可以说,索引m覆盖了我们的查询请求,这种情况我们就称为覆盖索引。
这也是源码下载为什么我们在很多MySQL规范中可以看到,要求我们查询数据时尽量避免"select *",就是因为"select *"会导致覆盖索引失效,从而引起强制回表,sql性能可能大幅下降。
最后
在我们查询SQL时,我们不仅要考虑where条件是否匹配了索引,还要尽量考虑查询的字段是否可以通过索引直接获取,覆盖索引可以减少树的搜索次数,显著的提升SQL查询性能。
很赞哦!(5)
相关文章
- 便宜域名使用如何?小白可以买到便宜域名吗?
- Vue 项目打包部署总结
- 解决Vite-React项目中Js使用Jsx语法报错
- 三分钟实现 Spring Boot 集成 RabbitMQ,实现消息队列服务
- 顶级域名可以增加企业品牌的价值。随着经济的快速发展,域名已不再是企业在网络中的独立地位。顶级域名的服务范围、企业产品、综合形象体现等,对于企业单位来说,顶级域名的重要性不言而喻。
- 小技巧 | 巧妙实现不定宽溢出文本循环滚动展示
- 你知道吗?子集问题也要去重了!
- 如何做好高并发系统设计,我总结了三点
- 付款完成后,您只需耐心等待,如果您注册成功,系统会提示您。这里需要注意的是,域名是一个即时产品,只有在最终付款成功时才能预订,注册成功后不能更改。
- 从Jar包冲突搞到类加载机制,就是这么霸气