MySQL----覆盖索引
文章目录
尽量使用覆盖索引,减少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----覆盖索引相关推荐
- MySQL覆盖索引(Covering Index)
MySQL覆盖索引(Covering Index) mysql高效索引之覆盖索引 概念 如果索引包含所有满足查询需要的数据的索引成为覆盖索引(Covering Index),也就是平时所说的不需要回表 ...
- MySQL 覆盖索引
本文主要概述mysql的覆盖索引,以及几种常见的优化场景 内容概要 聚集索引和辅助索引 什么是覆盖索引 几种优化场景 总体建议 聚集索引和辅助索引 聚集索引(主键索引) -innodb存储引擎是索引组 ...
- MySQL 覆盖索引、最左前缀原则、索引下推
1.覆盖索引 1.1 概念 索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了.如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引 ...
- mysql覆盖索引二次查找_mysql中关于覆盖索引的知识点总结
如果一个索引包含(或覆盖)所有需要查询的字段的值,称为'覆盖索引'. 覆盖索引是一种非常强大的工具,能大大提高查询性能,只需要读取索引而不需要读取数据,有以下优点: 1.索引项通常比记录要小,所以My ...
- 简单易懂的MySQL覆盖索引、前缀索引、索引下推
文章目录 前言 常见的索引类型 聚簇索引/非聚簇索引 覆盖索引 前缀索引 索引下推 前言 索引的出现是为了提高数据查询效率,像书的目录一样.对于数据库的表而言,索引其实就是"目录" ...
- MySQL 覆盖索引(Cover Index)
概述 一个索引包含了所有需要查询的字段值,那么就称为覆盖索引. 好处 索引的大小通常远小于数据行大小,所以如果只需要读取索引,那么MySQL会极大的减少数据访问量. 索引是按照值得顺序存储的. Inn ...
- mysql覆盖索引详解
如果一个索引包含(或覆盖)所有需要查询的字段的值,称为'覆盖索引'.即只需扫描索引而无须回表. 只扫描索引而无需回表的优点: 1.索引条目通常远小于数据行大小,只需要读取索引,则mysql会极大地减少 ...
- mysql覆盖索引解决模糊查询失效_关于MySQL的SQL优化之覆盖索引
前些天,有个同事跟我说:"我写了个SQL,SQL很简单,但是查询速度很慢,并且针对查询条件创建了索引,然而索引却不起作用,你帮我看看有没有办法优化?". 我对他提供的case进行了 ...
- Mysql 覆盖索引及其使用注意事项
一,什么叫覆盖索引 网上对覆盖索引的定义有如下三种: 解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖. 解释二: 索引是高效找到行的一 ...
- MySQL覆盖索引:直接从索引查询到了数据
标志:覆盖索引的标志 extra的using index ; 定义:sql直接从索引查找到了数据 没有去数据表查找 就是索引覆盖了 就是覆盖索引 结合:有using where和using id ...
最新文章
- 全球第二家 亚马逊“喜提”万亿美金市值 AI或是最大功臣
- JavaWEB开发21——综合项目(图书商城)
- IE6,IE7,FF等浏览器不兼容原因及解决办法(转)
- n.html id=198,YPE htmlhtml lang=enhead data-n-head-ssrtitle data-n-=true小程序获取不到unionid 微信开放社区...
- 解决ubuntu系统root用户下Chrome无法启动问题
- 数据新动能:帆软第四届智数大会圆满落幕
- java spring 数据库_JAVA - SpringBoot项目引用MyBatis操作数据库
- 前端通过ajax请求一次性上传多张图片到后台
- 走进音视频的世界——杜比音效之AC3与AC4
- 【DP专题】LintCode刷题笔记
- matlab qpsk 星座图,QPSK误码率和星座图MATLAB仿真
- Win11怎么进行屏幕休眠时间的设置
- Security Warning: The negotiated TLS 1.0 is an insecure protocol and is supported for backward compa
- 计算机网络原理第七版word,计算机网络原理简答题
- springboot学习
- ros2上怎样才能玩rmf?
- 利用Maya快速简便建立山脉模型
- win10亮度无法调整(Win10无法调节亮度)
- 计算机视觉 深度学习 slam 三维重建 机器学习学习资料整理
- linux安装make
热门文章
- 6 月程序员平均工资又来啦!平均工资 15K ,你拖后腿了吗?
- windows10下安装、配置vim及YCM安装
- Devtools inspection is not available because it‘s in production mode or explicitly disabled by the a
- 全国计算机一级考试wps,2017全国计算机一级考试WPS Office考试大纲
- python 图片拼接
- 极速简单实现Android 屏幕录制编码为H264并且使用RTMP推流
- 千兆PHY作为百兆使用时的连接方式
- js中函数、方法、对象的区别
- HBuilderX编辑器F11退出全屏无效的解决办法 - 切换免打扰模式
- C++ 中的分号 语句块