回表的概念

先得出结论,根据下面的实验。如果我要获得['liu','25']这条记录。需要什么步骤。

  • 1.先通过['liu']记录对应到普通索引index(name),获取到主键id:4.
  • 2.再通过clustered index,定位到行记录。也就是上面说的这条['liu','25']记录数据。

因此,上述就是说的回表查询,先定位主键值,再定位行记录。多扫了一遍索引树。

当然,也就多耗费了CPU,IO,内存等。

1.stu_info表案例

create table stu_info (
id int primary key,
name varchar(20),
age int,
index(name)
)

2.查看刚刚建立的表结构

mysql> show create table stu_info\G;
*************************** 1. row ***************************
Table: stu_info
Create Table: CREATE TABLE `stu_info` (
`id` int(11) NOT NULL,
`name` varchar(20) COLLATE utf8_bin DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.00 sec)

3.插入测试数据

insert into stu_info values(1,'zhang',20);
insert into stu_info values(4,'liu',25);
insert into stu_info values(7,'huang',19);
insert into stu_info values(10,'allen',27);
insert into stu_info values(30,'benjiemin',27);
insert into stu_info values(16,'roger',27);
insert into stu_info values(28,'peter',16);
commit

4.分析过程

我们来分析这几条数据的索引。由于我们name这个列建立了索引。所以name索引存储会按照【a~z】顺序排列。通过select语句,可以得到一些感性认识。如下:

mysql> select name from stu_info;
+-----------+
| name |
+-----------+
| allen |
| benjiemin |
| huang |
| liu |
| peter |
| roger |
| zhang |
+-----------+

上述的普通索引secondary index在B+树存储格式可能如下:

根据旧金山大学提供的可视化B+tree的效果。

其可视化地址为:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html

如下图:

我在根据上面的图,画一个自己的。如下图所示:

也能看到name这几个数据建立的B+树是怎么样的。也能看到我需要找到[liu]这个元素的话,需要两次查找。

但是,如果我的需求是,除了获取name之外还需要获取age的话。这里就需要回表了。为什么?因为我找不到age数据。

  • 普通索引的叶子节点,只存主键。

那么clustered index聚集索引是如何保存的呢?继续使用上述可视化工具,再分析一波。

上图是聚集索引的示意图。转化为我的图如下:

所以,name='liu'查询liu的年龄,是需要回表的。首先查询普通索引的B+树,再查询聚集索引的B+树。最后得到liu的那条行记录。

5.执行计划

我们也可以通过执行计划来分析以下。如下:

mysql> explain select id,name,age from stu_info where name='liu'\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: stu_info
type: ref
possible_keys: name
key: name
key_len: 63
ref: const
rows: 1
Extra: Using index condition
1 row in set (0.00 sec)

看到Using index condition,我们这里用到了回表。

如果不取age,只取id和name的话,那么。就不需要回表。如下实验,继续看执行计划:

mysql> explain select id,name from stu_info where name='liu'\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: stu_info
type: ref
possible_keys: name
key: name
key_len: 63
ref: const
rows: 1
Extra: Using where; Using index
1 row in set (0.00 sec)

那么,如果我们不想回表,不想多做IO的话。我们可以通过建立组合索引来解决这个问题。通过

ALTER TABLE stu_info DROP INDEX  name;
alter table stu_info add key(name,age);

我们再继续看执行计划,如下:

mysql> explain select name,age from stu_info where name='liu'\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: stu_info
type: ref
possible_keys: name
key: name
key_len: 63
ref: const
rows: 1
Extra: Using where; Using index
1 row in set (0.00 sec)

可以看到额外信息是Using where; Using index而不是Using index condition也就没有用到回表了。

MySQL数据库回表与索引的更多相关文章

  1. MySQL 数据库性能优化之索引优化

    接着上一篇 MySQL 数据库性能优化之表结构,这是 MySQL数据库性能优化专题 系列的第三篇文章:MySQL 数据库性能优化之索引优化 大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引 ...

  2. 第二百七十七节,MySQL数据库-数据表、以及列的增删改查

    MySQL数据库-数据表.以及列的增删改查 1.创建一个表 CREATE(创建) TABLE(表) ENGINE(引擎) ENGINE=INNODB(引擎)还有很多类引擎,这里只是简单的提一下INNO ...

  3. Mysql数据库的数据类型、索引、锁、事务和视图

    Mysql数据库的数据类型.索引.锁.事务和视图 数据的类型 1)数据类型: 数据长什么样? 数据需要多少空间来存放? 系统内置数据类型和用户定义数据类型 2)MySql 支持多种列类型: 数值类型 ...

  4. InnoDB 聚集索引和非聚集索引、覆盖索引、回表、索引下推简述

    关于InnoDB 存储引擎的有聚集索引和非聚集索引,覆盖索引,回表,索引下推等概念,这些知识点比较多,也比较零碎,但是概念都是基于索引建立的,本文从索引查找数据讲述上述概念. 聚集索引和非聚集索引 在 ...

  5. MySQL数据库以及表的管理

    MySQL数据库以及表的管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 今天我们探讨的话题就是如何使用MySQL做开发,我们运维的主要工作不是去开发SQL的,但尽管如此,我们有 ...

  6. MySQL数据库之表的增删改查

    目录 MySQL数据库之表的增删改查 1 引言 2 创建表 3 删除表 4 修改表 5 查看表 6 复制表 MySQL数据库之表的增删改查 1 引言 1.MySQL数据库中,数据库database就是 ...

  7. Mariadb/MySQL数据库单表查询基本操作及DML语句

    Mariadb/MySQL数据库单表查询基本操作及DML语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一数据库及表相关概述 1>.数据库操作 创建数据库: CREATE ...

  8. MySQL数据库INNODB 表损坏修复处理过程

    MySQL数据库INNODB 表损坏修复处理过程 博客分类: mysql tomcatmysql  最近mysql数据库经常死掉,用命令net stop mysql命令也无法停掉,关闭Tomcat的时 ...

  9. MySQL基础知识:创建MySQL数据库和表

    虚构一个微型在线书店的数据库和数据,作为后续MySQL脚本的执行源,方便后续MySQL和SQL的练习. 在虚构这个库的过程中,主要涉及的是如何使用命令行管理 MySQL数据库对象:数据库.表.索引.外 ...

随机推荐

  1. C#多线程(13):任务基础①

    目录 多线程编程 多线程编程模式 探究优点 任务操作 两者创建任务的方式 Task.Run() 创建任务 取消任务和控制任务的创建 任务返回结果以及异步获取返回结果 捕获任务异常 全局捕获任务异常 多 ...

  2. RSA,AES加解密算法的实现

    目录 Python实现RSA公钥加密算法 RSA公钥加密算法原理 RSA算法的Python实现 AES加解密算法实现 AES加解密算法原理 AES加解密算法Python实现 参考文献 Python实现 ...

  3. JDK12的五大重要新特性

    文章目录 JDK12的五大重要新特性 引入JVM常量API 扩展了switch语句 支持Unicode 11.0 为日本Reiwa Era提供了方形字符支持 NumberFormat增加了对以紧凑格式 ...

  4. XEP-0199 XMPP Ping

    原文来自:https://xmpp.org/extensions/xep-0199.html,只翻译了技术方面的内容. 摘要:这个规范定义了一个通过XML流发送应用级别pings的XMPP扩展协议.这 ...

  5. PAT A1023

    简单的大数问题,long long并不能容纳21位数字,这是刚开始没有注意到的 #include<iostream> #include<stdlib.h> #include&l ...

  6. uboot on qemu

    1, download uboot ftp://ftp.denx.de/pub/u-boot/ 2, compile uboot make vexpress_ca9x4_config export A ...

  7. Codeforces 1291 Round #616 (Div. 2) C. Mind Control(超级详细)

    C. Mind Control You and your n−1 friends have found an array of integers a1,a2,-,an. You have decide ...

  8. 数学--数论--HDU1222 狼和兔子(最大公约数)

    问题描述 有一座周围有n个洞的小山.孔从0到n-1有符号. 兔子必须藏在其中一个洞中.狼以逆时针方向搜索兔子.他第一个进入的洞是一个用0签名的洞.然后,他将每m个洞进入一个洞.例如,m = 2和n = ...

  9. 图论--最长路--基于SPFA的调整模板

    #include<iostream> #include<queue> #include<algorithm> #include<set> #includ ...

  10. CodeForces - 1245 C - Constanze's Machine

    Codeforces Round #597 (Div. 2) Constanze is the smartest girl in her village but she has bad eyesigh ...