文章目录



尽量使用覆盖索引,减少select *。

覆盖索引:
指查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到 。

explain select id, profession from tb_user where profession = '软件工程' and age = 31 and status = '0' ;

explain select id,profession,age, status from tb_user where profession = '软件工程' and age = 31 and status = '0' ;

explain select id,profession,age, status, name from tb_user where profession = '软 件工程' and age = 31 and status = '0' ;

explain select * from tb_user where profession = '软件工程' and age = 31 and status = '0';


关注Extra,前面两条SQL的结果为 Using where; Using Index ; 而后面两条SQL的结果为: Using index condition 。

Extra 含义
Using where; Using Index 查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据
Using index condition 查找使用了索引,但是需要回表查询数据

在 tb_user 表中有一个联合索引 idx_user_pro_age_sta,该索引关联了三个字段 profession、age、status,而这个索引也是一个二级索引,所以叶子节点下面挂的是这一行的主键id。 所以当我们查询返回的数据在 id、profession、age、status 之中,则直接走二级索引直接返回数据了。

如果超出这个范围,就需要拿到主键id,再去扫描聚集索引,再获取额外的数据,这个过程就是回表。

而我们如果一直使用select * 查询返回所有字段值,很容易就会造成回表查询(除非是根据主键查询,此时只会扫描聚集索引)。


id是主键,是一个聚集索引。 name字段建立了普通索引,是一个二级索引(辅助索引)。

select * from tb_user where id = 2;

根据id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。

selet id,name from tb_user where name = 'Arm';

虽然是根据name字段查询,查询二级索引,但是由于查询返回在字段为 id,name,在name的二级索引中,这两个值都是可以直接获取到的,因为覆盖索引,所以不需要回表查询,性能高。

selet id,name,gender from tb_user where name = 'Arm';

由于在name的二级索引中,不包含gender,所以,需要两次索引扫描,也就是需要回表查询,性能相对较差一点。

思考题:
一张表, 有四个字段(id, username, password, status), 由于数据量大, 需要对以下SQL语句进行优化, 该如何进行才是最优方案:

select id,username,password from tb_user where username = 'itcast';

针对于 username, password建立联合索引, sql为:

 create index idx_user_name_pass on tb_user(username,password);

这样可以避免上述的SQL语句,在查询的过程中,出现回表查询。

MySQL----覆盖索引相关推荐

  1. MySQL覆盖索引(Covering Index)

    MySQL覆盖索引(Covering Index) mysql高效索引之覆盖索引 概念 如果索引包含所有满足查询需要的数据的索引成为覆盖索引(Covering Index),也就是平时所说的不需要回表 ...

  2. MySQL 覆盖索引

    本文主要概述mysql的覆盖索引,以及几种常见的优化场景 内容概要 聚集索引和辅助索引 什么是覆盖索引 几种优化场景 总体建议 聚集索引和辅助索引 聚集索引(主键索引) -innodb存储引擎是索引组 ...

  3. MySQL 覆盖索引、最左前缀原则、索引下推

    1.覆盖索引 1.1 概念 索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了.如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引 ...

  4. mysql覆盖索引二次查找_mysql中关于覆盖索引的知识点总结

    如果一个索引包含(或覆盖)所有需要查询的字段的值,称为'覆盖索引'. 覆盖索引是一种非常强大的工具,能大大提高查询性能,只需要读取索引而不需要读取数据,有以下优点: 1.索引项通常比记录要小,所以My ...

  5. 简单易懂的MySQL覆盖索引、前缀索引、索引下推

    文章目录 前言 常见的索引类型 聚簇索引/非聚簇索引 覆盖索引 前缀索引 索引下推 前言 索引的出现是为了提高数据查询效率,像书的目录一样.对于数据库的表而言,索引其实就是"目录" ...

  6. MySQL 覆盖索引(Cover Index)

    概述 一个索引包含了所有需要查询的字段值,那么就称为覆盖索引. 好处 索引的大小通常远小于数据行大小,所以如果只需要读取索引,那么MySQL会极大的减少数据访问量. 索引是按照值得顺序存储的. Inn ...

  7. mysql覆盖索引详解

    如果一个索引包含(或覆盖)所有需要查询的字段的值,称为'覆盖索引'.即只需扫描索引而无须回表. 只扫描索引而无需回表的优点: 1.索引条目通常远小于数据行大小,只需要读取索引,则mysql会极大地减少 ...

  8. mysql覆盖索引解决模糊查询失效_关于MySQL的SQL优化之覆盖索引

    前些天,有个同事跟我说:"我写了个SQL,SQL很简单,但是查询速度很慢,并且针对查询条件创建了索引,然而索引却不起作用,你帮我看看有没有办法优化?". 我对他提供的case进行了 ...

  9. Mysql 覆盖索引及其使用注意事项

    一,什么叫覆盖索引 网上对覆盖索引的定义有如下三种: 解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖. 解释二: 索引是高效找到行的一 ...

  10. MySQL覆盖索引:直接从索引查询到了数据

    标志:覆盖索引的标志  extra的using index ; 定义:sql直接从索引查找到了数据  没有去数据表查找  就是索引覆盖了 就是覆盖索引 结合:有using where和using id ...

最新文章

  1. 全球第二家 亚马逊“喜提”万亿美金市值 AI或是最大功臣
  2. JavaWEB开发21——综合项目(图书商城)
  3. IE6,IE7,FF等浏览器不兼容原因及解决办法(转)
  4. n.html id=198,YPE htmlhtml lang=enhead data-n-head-ssrtitle data-n-=true小程序获取不到unionid 微信开放社区...
  5. 解决ubuntu系统root用户下Chrome无法启动问题
  6. 数据新动能:帆软第四届智数大会圆满落幕
  7. java spring 数据库_JAVA - SpringBoot项目引用MyBatis操作数据库
  8. 前端通过ajax请求一次性上传多张图片到后台
  9. 走进音视频的世界——杜比音效之AC3与AC4
  10. 【DP专题】LintCode刷题笔记
  11. matlab qpsk 星座图,QPSK误码率和星座图MATLAB仿真
  12. Win11怎么进行屏幕休眠时间的设置
  13. Security Warning: The negotiated TLS 1.0 is an insecure protocol and is supported for backward compa
  14. 计算机网络原理第七版word,计算机网络原理简答题
  15. springboot学习
  16. ros2上怎样才能玩rmf?
  17. 利用Maya快速简便建立山脉模型
  18. win10亮度无法调整(Win10无法调节亮度)
  19. 计算机视觉 深度学习 slam 三维重建 机器学习学习资料整理
  20. linux安装make

热门文章

  1. 6 月程序员平均工资又来啦!平均工资 15K ,你拖后腿了吗?
  2. windows10下安装、配置vim及YCM安装
  3. Devtools inspection is not available because it‘s in production mode or explicitly disabled by the a
  4. 全国计算机一级考试wps,2017全国计算机一级考试WPS Office考试大纲
  5. python 图片拼接
  6. 极速简单实现Android 屏幕录制编码为H264并且使用RTMP推流
  7. 千兆PHY作为百兆使用时的连接方式
  8. js中函数、方法、对象的区别
  9. HBuilderX编辑器F11退出全屏无效的解决办法 - 切换免打扰模式
  10. C++ 中的分号 语句块