• 相信读者看过很多MYSQL索引优化的文章,其中有很多优化的方法,比如最佳左前缀,覆盖索引等方法,但是你真正理解为什么要使用最佳左前缀,为什么使用覆盖索引会提升查询的效率吗?
  • 本篇文章将从MYSQL内部结构上讲一下为什么覆盖索引能够提升效率。

InnoDB索引模型

  • 在InnoDB中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。又因为前面我们提到的,InnoDB使用了B+树索引模型,所以数据都是存储在B+树中的。
  • 每一个索引在InnoDB里面对应一棵B+树

主键索引和非主键索引的区别

  • 主键索引又叫聚簇索引 ,非主键索引又叫普通索引,那么这两种索引有什么区别呢?
  • 主键索引的叶子节点存放的是整行数据,非主键索引的叶子节点存放的是主键的值。
  • 假设有一张User表(id,age,name,address),其中有id和age两个字段,其中id是主键,age是普通索引,有几行数据u1-u5的(id,age)的值是(100,1)、(200,2)、(300,3)、(500,5)和(600,6) ,此时的两棵树的示例如下:
  • 从上图可以看出来,基于主键索引的树的叶子节点存放的是整行User数据,基于普通索引age的叶子节点存放的是id(主键)的值。

什么是回表?

  • 假设有一条查询语句如下:
  select * from user where age=3;

  • 上面这条sql语句执行的过程如下:
    1、根据age这个普通索引在age索引树上搜索,得到主键id的值为300。
    2、因为age索引树并没有存储User的全部数据,因此需要根据在age索引树上查询到的主键id的值300再到id索引树搜索一次,查询到了u3。
    3、返回结果。
  • 上述执行的过程中,从age索引树再到id索引树的查询的过程叫做回表(回到主键索引树搜索的过程)。
  • 也就是说通过非主键索引的查询需要多扫描一棵索引树,因此需要尽量使用主键索引查询。

为什么使用覆盖索引?

  • 有了上述提及到的几个概念,便能很清楚的理解为什么覆盖索引能够提升查询效率了,因为少了一次回表的过程。
  • 假设我们使用覆盖索引查询,语句如下:
  select id from user where age=3;

  • 这条语句执行过程很简单,直接在age索引树中就能查询到id的值,不用再去id索引树中查找其他的数据,避免了回表。

总结

  • 覆盖索引的使用能够减少树的搜索次数,避免了回表,显著提升了查询性能,因此覆盖索引是一个常用的性能优化手段。

以上内容希望帮助到大家,更多PHP大厂PDF面试文档,PHP进阶架构视频资料,PHP精彩好文可以关注公众号:PHP开源社区,或者访问:

精华PHP技术文章整理合集——PHP框架篇

精华PHP技术文合集——微服务架构篇

精华PHP技术文合集——分布式架构篇

精华PHP技术文合集——高并发场景篇

精华PHP技术文章整理合集——数据库篇

作者:爱撒谎的男孩
来源:https://www.cnblogs.com/Chenjiabing/p/12736115.html

覆盖索引与联合索引_Mysql性能优化:为什么要用覆盖索引?相关推荐

  1. mysql索性为啥个别值比较慢_MySQL 性能优化:为什么 SQL 开启索引还是那么慢

    在最近的一个项目中,遇到一个Mysql数据库把CPU占用满了,从系统的资源监控中查看一下当时的状态.从 PMM 监控来看,这个 MySQL 实例每天上午九点 CPU 都会升高到 10%-20%,只有 ...

  2. mysql 字符串索引 优化_MySQL性能优化之索引调优实战

    索引失效场景或使用注意事项 a.索引无法存储null值,所以建议都给默认值 b.如果条件中有or,即使使用了索引条件也不起作用,所以尽量少用or 如果想使用or,又让索引生效,只能将or的每个列上加上 ...

  3. distinct性能问题_Mysql性能优化:如何给字符串加索引?

    导读 现代大部分的登录系统都支持邮箱.手机号码登录两种方式,那么如何在邮箱或者手机号码这个字符串上建立索引才能保证性能最佳呢? 今天这篇文章就来探讨一下在Mysql中如何给一个字符串加索引才能达到性能 ...

  4. mysql 去掉复合索引_MySQL性能优化[实践篇]-复合索引实例

    上篇文章最后提了个问题 假设某个表有一个**复合索引(c1,c2,c3,c4)**,问以下查询中只能使用该复合索引的c1,c2,c3部分的有那些 1. where c1=x and c2=x and ...

  5. mysql 重复率高字段 索引_MySQL性能优化(二)索引优化

    一.选择合适的列建立索引 1.在where从句,group by从句,order by从句,on从句中出现的列(select) 2.索引字段越小越好(表每页数据才会更多,IO效率会更高) 3.离散度大 ...

  6. mysql同时满足升序和降序_MySQL性能优化(三):索引

    点击上方蓝色"码农架构",选择"设为星标" 专注于高可用.高性能.高并发类技术分享! 索引原理 如果一本新华字典假如没有目录,想要查找某个字,就不得不从第一页开 ...

  7. mysql 查找相似数据_MySQL性能优化做得好的人,都懂的索引绝技

    一步一步推导出 MySQL索引的底层数据结构. MySQL作为互联网中非常热门的数据库,其底层的存储引擎和数据检索引擎的设计非常重要,尤其是 MySQL数据的存储形式以及索引的设计,决定了 MySQL ...

  8. Mysql 索引 与 多表查询性能优化

    最近做项目需要用到Luence Whoosh,要定时从数据库中索引出数据来供检索,但是在索引中设计多表查询,速度较慢,因为强迫症,想要做性能优化,因此把Mysql的核心又翻出来研究一遍. 关于MySQ ...

  9. SQL Server 2005 性能优化实战系列(文章索引)

    http://www.cnblogs.com/gaizai/archive/2012/01/20/2327814.html 前言 性能优化是数据库方向一个很重要的技能,这也是快速提供企业级应用性能最快 ...

最新文章

  1. Android studio 获取每次编译apk时的日期
  2. iOS无法导入头文件
  3. STL erase() 迭代器失效
  4. Python中有了列表,为什么还有元组?
  5. 磁盘阵列,双机热备,负载均衡
  6. SegmentFault 巨献 1024 程序猿游戏「红岸的呼唤」第一天任务攻略
  7. Oracle数据库基本概念理解(1)
  8. mybatis 取查询值_MyBatis-SELECT基本查询
  9. springMVC4(4)json与对象互转实例解析请求响应数据转换器
  10. 【PMP认证考试之个人总结】第 3 章 项目整合管理
  11. Wannafly 每日一题 2016-12-26 KAOS 字典树
  12. linux搭建windows无盘系统,linux下无盘系统的安装
  13. lede固件_开源路由器固件OPENWRT/LEDE出现远程代码执行漏洞请尽快升级
  14. 十个值得所有极客收藏的网站
  15. 会议录播软件测试自学,如何录制Zoom视频会议?
  16. linux V4L2子系统——v4l2的结构体(3)之v4l2_subdev
  17. 技术员 Ghost Win7 Sp1 x86 装机版/纯净版 201710
  18. IObit Unlocker删除/解锁占用的文件
  19. 最新首发宝塔最新7.9企业版破解开心版升级命令
  20. MD5简介及使用方式

热门文章

  1. Scikit-Learn 学得如何?程序员不容错过十大实用功能来袭
  2. 涨知识!Google 黑客常用搜索语句一览 | 原力计划
  3. Python 进阶之递归函数一点都不难!
  4. 美国AI公司30亿人脸数据被黑,遭科技巨头联合“封杀”
  5. 微软想让所有人都成为开发者?
  6. GitHub 上开源哪家强?| 原力计划
  7. “别傻了,你不需要区块链!”
  8. 中高级前端面试秘籍!金三银四如何直通大厂?!(长文)
  9. 为什么高级程序员尤其讨厌条条框框的束缚?
  10. 为什么 GitHub 上的开发者比 iOS 上的要更值钱?