举个栗子,假如有一张表:tableA

t(id PK, name KEY, sex, flag);  即id是聚集索引,name是普通索引。

分别执行2条SQL

SQL1 :   select id,name from  tableA  where name=‘shenjian‘

SQL2 :    select id,name,sex from tableA  where name=‘shenjian‘

结果是  SQL1查询速度极快,比SQL快很多,数据越多差异越明显,那这是为什么? 就因为多了一列?

这要从InnoDB的实现说起,

InnoDB有两大类索引:

聚集索引(clustered index)

普通索引 也叫非聚集索引(secondary index)

一张表必然有1个聚集索引(一颗B+树,叶子节点放的数据)

而普通索引的话,是在普通索引这颗B+树上,InnoDB普通索引的叶子节点存储主键值。

这是上面列子的表的聚簇索引,和普通索引

聚集索引图                        非聚集索引(普通索引)图

两个B+树索引分别如上图:

(1)id为PK,聚集索引,叶子节点存储行记录(按页);

(2)name为KEY,普通索引,叶子节点存储PK值,即id;

既然从普通索引无法直接定位行记录,那普通索引的查询过程是怎么样的呢?

通常情况下,需要扫码两遍索引树。

例如:

select * from t where name=‘lisi‘  是如何查找的呢

如粉红色路径,需要扫码两遍索引树:

(1)右边的树(普通索引),先通过普通索引定位到主键值id=5;

(2)在通过主键的值在聚集索引的树里定位到行记录;

这就是所谓的回表查询,先定位主键值,再定位行记录,它的性能较扫一遍索引树更低。

二、什么是索引覆盖****(Covering index)****?

只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。

覆盖索引其实是索引覆盖的意思,索引字段就已经囊括select查询的字段,即索引字段覆盖了需查询的字段。

三、如何实现索引覆盖?

常见的方法是:将被查询的字段,建立到联合索引里去。

select id,name from user where name=‘shenjian‘;

能够命中name索引,索引叶子节点存储了主键id,通过name的索引树即可获取id和name,无需回表,符合索引覆盖,效率较高。

作者:Harri2012

链接:https://www.jianshu.com/p/8991cbca3854

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

mysql 回表 覆盖索引_mysql 14 覆盖索引+回表相关推荐

  1. mysql 回表 覆盖索引_MySQL 的覆盖索引与回表的使用方法

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

  2. vectorC++索引_MySQL 的覆盖索引与回表

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

  3. mysql 重置表索引_MySQL如何进行索引重建操作?

    在MySQL数据库中,没有类似于SQL Server数据库或Oracle数据库中索引重建的语法(ALTER INDEX ... REBUILD),那么在MySQL数据库中,是否有什么方式重建索引呢? ...

  4. mysql 索引表的应用_MySQL查询优化之索引的应用详解

    糟糕的SQL查询语句可对整个应用程序的运行产生严重的影响,其不仅消耗掉更多的数据库时间,且它将对其他应用组件产生影响. 如同其它学科,优化查询性能很大程度上决定于开发者的直觉.幸运的是,像MySQL这 ...

  5. mysql优化和索引_mysql优化和索引

    表的优化 1.定长与变长分离 如 int,char(4),time核心且常用字段,建成定长,放在一张表: 而varchar,text,blob这种变长字段适合单放一张表,用主键与核心表关联. 2.常用 ...

  6. mysql辅助索引非叶子节点_Mysql的聚集索引与辅助索引

    Mysql数据库中的B+树索引可以分为聚集索引和辅助索引(非聚集索引).本文将介绍一下两者. 聚集索引 聚集索引:指索引项的排序方式和表中数据记录排序方式一致的索引(这里不懂先放着,一会举例),每张表 ...

  7. MySQL第九章索引_MySQL高级(索引优化+慢查询定位)

    一.先谈谈事务 1. ACID特性 1.1 原子性: 事务是最小的执行单位,不允许分割.事务的原子性确保动作要么全部完成,要么完全不起作用: 1.2 一致性: 执行事务前后,数据库从一个一致性状态转换 ...

  8. mysql 聚簇索引和非聚簇索引_MySQL 聚簇索引 二级索引 辅助索引(上两期中奖名单)...

    阅读文本大概需要3分钟. MySQL中每个表都有一个聚簇索引( clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引( secondary indexes ). ...

  9. mysql优化之索引_mysql优化之索引

    概念: 在数据库中除了数据之外,还维护着满足特定查找算法的数据结构.这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引.通常使用B树以及变种B+树 ...

最新文章

  1. Python之pandas数据加载、存储
  2. 使用ifstream和getline读取文件内容[c++]
  3. 组件化与插件化的差别在哪里?内含福利
  4. Flink 1.9 : Wordcount报错:ClassNotFoundException: yarn.exceptions.YarnException
  5. opencv-api convexityDefects
  6. 解决maven打包打不进lib下的第三方jar包问题
  7. CImage 设置任意像素的RGB值
  8. 基于sa866的电磁搅拌器计算机控制系统,一种新型电磁搅拌器计算机控制系统
  9. 【Sinclair/记录】Rainmeter在电脑桌面添加GIF
  10. macbook硬盘读写速度测试(Disk Speed Test 测速贴图)
  11. 关于“如何使用FFT计算天线阵列方向图”的学习资料总结
  12. 潘多拉固件设置ipv6_WAN口获取单一IPv6地址时,内网使用IPv6的方法(教育网可用)...
  13. Crypto-Enigma密码机原理
  14. C++实现求复数的模长
  15. 贸易情报,下一代开拓海外市场的工具,免费在线体验
  16. 安卓模拟ibeacon_【首发】联接真实与虚拟世界:Estimote Beacons Developer Kit 低功耗蓝牙开发套件...
  17. 微信自动邀请加群!!!
  18. 最好的肠道菌群科普记录片
  19. inprivate浏览是什么意思_InPrivate浏览是什么?
  20. 后台接口被访问到,前台控制台却提示404

热门文章

  1. matlab 仿真钢琴,用Matlab模拟钢琴的声音
  2. ubuntu 命令行torrent种子下载
  3. 从Applet中读取Cookie Access Cookies from a Java Applet
  4. 报错,Field cardTypeService in cn.yihuazt.cols.controller.CardTypeController required a bean of type ‘c
  5. 利用Eigen进行矩阵计算
  6. Rational Rose学习笔记01:安装与注册
  7. 前端学习笔记:Bootstrap框架入门
  8. 论文笔记 - 《ImageNet Classification with Deep Convolutional Neural Networks》 精典
  9. 简单的计算机英语文章,简单的英语小短文欣赏
  10. java web汽车商城_基于jsp的汽车销售商城系统