目录

  • 索引分类
  • 聚簇索引
  • 回表
  • 覆盖索引(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】回表与覆盖索引相关推荐

  1. MySQL回表与覆盖索引

    MySQL回表与覆盖索引 1. MySQL存储引擎 2. MySQL索引结构 2.1 B树和B+树定义 2.2 B树和B+树区别 2.3 B+Tree优点 3. MySQL索引回表 4. MySQL覆 ...

  2. mysql 回表查询优化_MySQL优化:如何避免回表查询?什么是索引覆盖?

    转自:https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651962609&idx=1&sn=46e59691257 ...

  3. mysql联合索引查找过程_(MYSQL)回表查询原理,利用联合索引实现索引覆盖

    一.什么是回表查询? 这先要从InnoDB的索引实现说起,InnoDB有两大类索引: 聚集索引(clustered index) 普通索引(secondary index) InnoDB聚集索引和普通 ...

  4. mysql 回表 覆盖索引_mysql 14 覆盖索引+回表

    举个栗子,假如有一张表:tableA t(id PK, name KEY, sex, flag);  即id是聚集索引,name是普通索引. 分别执行2条SQL SQL1 :   select id, ...

  5. mysql 回表查询优化_mysql:若何行使笼罩索引制止回表优化查询

    说到笼罩索引之前,先要领会它的数据结构:B+树. 先建个表演示(为了简朴,id按顺序建): id name 1 aa 3 kl 5 op 8 aa 10 kk 11 kl 14 jk 16 ml 17 ...

  6. 如何避免mysql回表查询_mysql如何避免回表查询

    <迅猛定位低效SQL?>留了一个尾巴: select id,name where name='shenjian' select id,name,sexwhere name='shenjia ...

  7. mysql查询回表什么意思_什么是MYSQL回表查询

    select id,name where name='shenjian' select id,name,sex where name='shenjian' 多查询了一个属性,为何检索过程完全不同? 什 ...

  8. SQL - MySQL回表

    一.回表概念:现象 回表,顾名思义就是回到表中,也就是先通过普通索引(我们自己建的索引不管是单列索引还是联合索引,都称为普通索引)扫描出数据所在的行,再通过行主键ID 取出索引中未包含的数据.所以回表 ...

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

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

最新文章

  1. Spring 4 CustomEditorConfigurer Example--转
  2. 解决网站请求速度慢的一些方法
  3. ASP.NET Core 认证与授权[7]:动态授权
  4. mysql8.0.20 64位安装教程_MySQL8.0.20压缩版本安装教程图文详解
  5. 掌阅科技前三季度净利润1.66亿元 同比增长53.75%
  6. LayuI固定块关闭
  7. Android Audio BSP工程师 需要清楚的基本知识点
  8. 虐哭无数人的烧脑刑侦科推理题,程序员一秒解
  9. ECshop新手入门模板制作教程[转载]
  10. 如何用css设置文字加粗,css如何设置文字加粗
  11. 戒指你戴对了吗?Meet Surprise教你正确的戴法
  12. people are able to buy the same products anywhere in the world
  13. 破解WIFI详细教程
  14. 二分法的复杂度O(log2n)是什么意思
  15. 低速接口之SPI接口,分类,四种模式,特点
  16. 【数据库】浅谈WITH CHECK OPTION的作用
  17. 武汉大学计算机学院国家重点实验室,实验室简介
  18. 对脏写、脏读、不可重复度、幻读的理解笔记
  19. OWASP ZAP mac版Chrome代理配置
  20. C语言中的或,与,非,异或

热门文章

  1. 网络教育计算机基础b卷,计算机应用基础试题b卷
  2. c语言编写蝙蝠侠标志,CSS3 蝙蝠侠标志
  3. 到底企业招人是更看重学历,还是能力呢?
  4. RFID车辆管理系统
  5. Android:Touch事件拦截机制
  6. 联想小新i1000拆机图解_弃独显配锐炬集显 联想小新I1000时尚本评测
  7. Linux重命名文件和文件夹
  8. OAuth2-单点-多点-三方登录
  9. 39个家宽用户屋内wifi网速调查
  10. Linux学习阶段性总结Engineer