说到笼罩索引之前,先要领会它的数据结构:B+树。

先建个表演示(为了简朴,id按顺序建):

id

name

1

aa

3

kl

5

op

8

aa

10

kk

11

kl

14

jk

16

ml

17

mn

18

kl

19

kl

22

hj

24

io

25

vg

29

jk

31

jk

33

rt

34

ty

35

yu

37

rt

39

rt

41

ty

45

qt

47

ty

53

qi

57

gh

61

dh

以主键以外的列值作为键值构建的 B+ 树索引,我们称之为非群集索引。

非群集索引与群集索引的区别在于非群集索引的叶子节点不存储表中的数据,而是存储该列对应的主键,想要查找数据我们还需要凭据主键再去群集索引中举行查找,这个再凭据群集索引查找数据的历程,我们称为回表。

B+树

B+树和B树是mysql索引的常用数据结构,B+树是B树的进一步优化,将上面的表转成图剖析一下:

B+树的特点:

1.B+ 树非叶子节点上是不存储数据的,仅存储键值

2.叶子节点的数据是根据顺序排列的

3. B+ 树中各个页之间是通过双向链表毗邻

聚簇索引和非聚簇索引

B+ 树索引根据存储方式的差别分为群集索引和非群集索引。

聚簇索引:

以 InnoDB 作为存储引擎的表,表中的数据都市有一个主键,纵然你不建立主键,系统也会帮你建立一个隐式的主键。

这是由于 InnoDB 是把数据存放在 B+ 树中的,而 B+ 树的键值就是主键,在 B+ 树的叶子节点中,存储了表中所有的数据。

这种以主键作为 B+ 树索引的键值而构建的 B+ 树索引,我们称之为群集索引。

非聚簇索引:

以主键以外的列值作为键值构建的 B+ 树索引,我们称之为非群集索引。

非群集索引与群集索引的区别在于非群集索引的叶子节点不存储表中的数据,而是存储该列对应的主键,想要查找数据我们还需要凭据主键再去群集索引中举行查找,这个再凭据群集索引查找数据的历程,我们称为回表。

如何用笼罩索引制止回表

为什么明显用了非主键索引还会回表,简朴说就是非主键索引是非聚簇索引,在B+树叶子节点中只保留主键和该非主键索引,一次查询只能查到这两个字段,若是想查三个字段,就必须再查一次聚簇索引,这就是回表。

举个例子,表中新增一个字段age,我们用name建一个索引(非聚簇索引)

id

name

age

10

zs

23

7

ls

54

13

ww

12

5

zl

76

8

xw

23

12

xm

43

17

dy

21

select id,name from user where name = 'zs';

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

select id,name,age from user where name = 'zs';

能够掷中name索引,索引叶子节点存储了主键id,但age字段必须回表查询才气获取到,不相符索引笼罩,需要再次通过id值扫码群集索引获取age字段,效率会降低。

结论:那怎么做才气制止回表呢?很简朴,将单列索引(name)升级为团结索引(name,age).

mysql 回表查询优化_mysql:若何行使笼罩索引制止回表优化查询相关推荐

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

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

  2. mysql 回表查询优化_MySQL中的回表查询与索引覆盖:一次百万级别分页查询使用Limit 从90秒到0.6毫秒的优化...

    这里写目录标题 事故现场 解决方案 提到的"回表查询" InnoDB的索引 什么是回表查询 怎么优化回表查询 事故现场 数据库使用的MySQL,有一个日志表,需要进行分页查询,于是 ...

  3. mysql分布式数据库架构_MySQL分布式数据库架构:分库、分表、排序、分页、分组、实现教程...

    MySQL分库分表总结: 单库单表 : 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 单库多表 : 随着用户数量的增加, ...

  4. mysql创建备份表脚本_MySQL 备份脚本(单库/分库分表)

    MySQL数据库分库备份 数据库密码保存在/etc/my.cnf文件中,所以在执行与mysql相关的命令不需要输入密码 分库备份思路: mysqldump db1 >db1.sql.gz mys ...

  5. mysql中视图备份_MySQL 事务、视图、索引、备份和恢复

    事务 为什么需要事务: 转账.总量不变,但其他值进行变化. 事务是什么: 作为单个逻辑工作单元执行的一系列操作. 多个操作作为一个整体向系统提交,要么执行/不执行. 事务是一个不可分割的工作逻辑单元. ...

  6. 给mysql添加主键_MySQL添加主键、索引

    查看索引 SHOW INDEX FROM  数据库表名 比如:SHOW INDEX FROM order_info; 添加索引 alter table 数据库add index 索引名称(数据库字段名 ...

  7. mysql回滚用法_Mysql误操作后利用binlog2sql快速回滚的方法详解

    前言 在日常工作或者学习中,操作数据库时候难免会因为"大意"而误操作,需要快速恢复的话通过备份来恢复是不太可能的,下面这篇文章主要给大家介绍关于Mysql误操作后利用binlog2 ...

  8. mysql 存储过程 异常 回滚吗_MySQL 5.7 存储过程报错不回滚

    本人在做项目时,遇到了一个异常蛋疼的问题,困扰了很久. 项目原先的数据库选用的是Oracle,后来到新项目中,换成了MySQL,一些主要的业务操作都是由Procedure来实现完成的.之前写过SqlS ...

  9. mysql自带查询优化_MySQL之select in 子查询优化的实现

    下面的演示基于MySQL5.7.27版本 一.关于MySQL子查询的优化策略介绍: 子查询优化策略 对于不同类型的子查询,优化器会选择不同的策略. 1. 对于 IN.=ANY 子查询,优化器有如下策略 ...

最新文章

  1. g++ 编译pybind
  2. Android Makefile编译流程
  3. SAP Fiori Elements - When is catalog annotation $value loaded
  4. javax.ws.rs.NotSupportedException: Cannot consume content type
  5. Linux C高级编程——网络编程之UDP(4)
  6. 为了一个HTTPS,浏览器操碎了心···
  7. mydate97设置时间
  8. 电脑键盘练习_用键盘打字怎样才能练得快,有什么窍门没?
  9. 分类算法python程序_分类算法——k最近邻算法(Python实现)(文末附工程源代码)...
  10. 再学 GDI+[45]: 文本输出 - 文本呈现质量
  11. 服装打版软件ET2019淘宝100RMB买的
  12. steam 经典 android,游戏玩家必备 Android版Steam试用
  13. 监理项目的服务器,idc服务器机房搬迁工程施工监理的重点
  14. 全球与中国Epicor渠道合作伙伴市场现状及未来发展趋势
  15. pig java api_pig CheckToken过程讲解
  16. 居然打不开msi文件?
  17. Margin对span无效
  18. fpga运算服务器_当FPGA也成为一种服务,你还在顾虑什么?
  19. Css中路径data:image/png;base64的用法详解 (转载)
  20. dreamweaver如何连接mysql_Dreamweaver连接数据库教程(ASP类)

热门文章

  1. ps怎么自定义dialog的样式跟输入框
  2. matlab编写关于离散的傅里叶变换
  3. Chrome浏览器多开
  4. C语言:判断一个数是否为素数(3种方法,含注释)
  5. 三星手机电池循环清零代码_2018年自然语言处理最值得关注的研究、论文和代码...
  6. docker搭建searx_Searx
  7. 瀑布开发模式和敏捷开发模式的区别和思考
  8. 机器学习深度学习视频资料汇总
  9. 雷达编程实战之恒虚警率(CFAR)检测
  10. 树莓派WIFI信号强度测试