【MySQL】回表与覆盖索引
目录
- 索引分类
- 聚簇索引
- 回表
- 覆盖索引(Cover Index)
索引分类
索引可以按照以下几个角度进行分类:
从数据结构的角度分类
- B+tree 索引
- Hash 索引
- Full-texts索引
从物理存储的角度分类
- 聚簇索引
- 二级索引(辅助索引)
从索引字段特性的角度分类
- 主键索引
- 唯一索引
- 普通索引
- 前缀索引
从组成索引的字段个数的角度分类
- 单列索引
- 联合索引(复合索引)
聚簇索引
InnoDB表要求必须有聚簇索引(Clustered Index),默认在主键字段上建立聚簇索引,在没有主键字段的情况下,表的第一个NOT NULL 的唯一索引将被建立为聚簇索引,在前两者都没有的情况下,InnoDB将自动生成一个隐式自增id列并在此列上创建聚簇索引。除聚簇索引外,其他的都称之为非主键索引,非主键索引也被称为二级索引(Secondary Index),或者叫作辅助索引。
对于聚簇索引和二级索引,使用的数据结构都是 B+Tree,唯一的区别在于叶子结点中存储的内容不同:
- 聚簇索引的叶子结点存储的是一行完整的数据。
- 二级索引的叶子结点存储的则是主键值。
这就是两者最大的区别。
回表
当我们需要查询的时候:
如果是通过主键索引来查询数据,例如 select * from user where id=100,那么此时只需要搜索主键索引的 B+Tree 就可以找到数据。
如果是通过非主键索引来查询数据,例如 select * from user where username=‘javaboy’,那么此时需要先搜索 username 这一列索引的 B+Tree,搜索完成后得到主键的值,然后再去搜索主键索引的 B+Tree,就可以获取到一行完整的数据。
对于第二种查询方式而言,一共搜索了两棵 B+Tree,第一次搜索 B+Tree 拿到主键值后再去搜索主键索引的 B+Tree,这个过程就是所谓的回表。
从上面的分析中我们也能看出,通过非主键索引查询要扫描两棵 B+Tree,而通过主键索引查询只需要扫描一棵 B+Tree,所以如果条件允许,还是建议在查询中优先选择通过主键索引进行搜索。
那么不用聚簇索引就一定需要回表吗?
不一定,请看覆盖索引:
覆盖索引(Cover Index)
如果索引包含所有需要查询的数据, 这样的索引称为覆盖索引(Covering Index),具有覆盖索引的表查询时不需要回表。
简单的说,覆盖索引覆盖所有需要查询的字段(即,大于或等于所查询的字段)。MySQL可以通过索引获取查询数据,因而不需要读取数据行。
覆盖索引的好处:
- 索引大小远小于数据行大小。因而,如果只读取索引,则能极大减少对数据访问量。
- 索引按顺序储存。对于IO密集型的范围查询会比随机从磁盘读取每一行数据的IO要少。
- 避免对主键索引的二次查询。二级索引的叶子节点包含了主键的值,如果二级索引包含所要查询的值,则能避免二次查询主键索引(聚簇索引,聚簇索引既存储了索引,也储存了值)。
最后附MySQL数据库体系结构图一张
参考链接:
浅谈 MySQL 索引的分类
什么是 MySQL 的“回表”?
【MySQL】回表与覆盖索引相关推荐
- MySQL回表与覆盖索引
MySQL回表与覆盖索引 1. MySQL存储引擎 2. MySQL索引结构 2.1 B树和B+树定义 2.2 B树和B+树区别 2.3 B+Tree优点 3. MySQL索引回表 4. MySQL覆 ...
- mysql 回表查询优化_MySQL优化:如何避免回表查询?什么是索引覆盖?
转自:https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651962609&idx=1&sn=46e59691257 ...
- mysql联合索引查找过程_(MYSQL)回表查询原理,利用联合索引实现索引覆盖
一.什么是回表查询? 这先要从InnoDB的索引实现说起,InnoDB有两大类索引: 聚集索引(clustered index) 普通索引(secondary index) InnoDB聚集索引和普通 ...
- mysql 回表 覆盖索引_mysql 14 覆盖索引+回表
举个栗子,假如有一张表:tableA t(id PK, name KEY, sex, flag); 即id是聚集索引,name是普通索引. 分别执行2条SQL SQL1 : select id, ...
- mysql 回表查询优化_mysql:若何行使笼罩索引制止回表优化查询
说到笼罩索引之前,先要领会它的数据结构:B+树. 先建个表演示(为了简朴,id按顺序建): id name 1 aa 3 kl 5 op 8 aa 10 kk 11 kl 14 jk 16 ml 17 ...
- 如何避免mysql回表查询_mysql如何避免回表查询
<迅猛定位低效SQL?>留了一个尾巴: select id,name where name='shenjian' select id,name,sexwhere name='shenjia ...
- mysql查询回表什么意思_什么是MYSQL回表查询
select id,name where name='shenjian' select id,name,sex where name='shenjian' 多查询了一个属性,为何检索过程完全不同? 什 ...
- SQL - MySQL回表
一.回表概念:现象 回表,顾名思义就是回到表中,也就是先通过普通索引(我们自己建的索引不管是单列索引还是联合索引,都称为普通索引)扫描出数据所在的行,再通过行主键ID 取出索引中未包含的数据.所以回表 ...
- mysql 回表 覆盖索引_MySQL 的覆盖索引与回表的使用方法
两大类索引 使用的存储引擎:MySQL5.7 InnoDB 聚簇索引 * 如果表设置了主键,则主键就是聚簇索引 * 如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索 ...
最新文章
- Spring 4 CustomEditorConfigurer Example--转
- 解决网站请求速度慢的一些方法
- ASP.NET Core 认证与授权[7]:动态授权
- mysql8.0.20 64位安装教程_MySQL8.0.20压缩版本安装教程图文详解
- 掌阅科技前三季度净利润1.66亿元 同比增长53.75%
- LayuI固定块关闭
- Android Audio BSP工程师 需要清楚的基本知识点
- 虐哭无数人的烧脑刑侦科推理题,程序员一秒解
- ECshop新手入门模板制作教程[转载]
- 如何用css设置文字加粗,css如何设置文字加粗
- 戒指你戴对了吗?Meet Surprise教你正确的戴法
- people are able to buy the same products anywhere in the world
- 破解WIFI详细教程
- 二分法的复杂度O(log2n)是什么意思
- 低速接口之SPI接口,分类,四种模式,特点
- 【数据库】浅谈WITH CHECK OPTION的作用
- 武汉大学计算机学院国家重点实验室,实验室简介
- 对脏写、脏读、不可重复度、幻读的理解笔记
- OWASP ZAP mac版Chrome代理配置
- C语言中的或,与,非,异或