MySQL数据库回表与索引
回表的概念
先得出结论,根据下面的实验。如果我要获得['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数据库回表与索引的更多相关文章
- MySQL 数据库性能优化之索引优化
接着上一篇 MySQL 数据库性能优化之表结构,这是 MySQL数据库性能优化专题 系列的第三篇文章:MySQL 数据库性能优化之索引优化 大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引 ...
- 第二百七十七节,MySQL数据库-数据表、以及列的增删改查
MySQL数据库-数据表.以及列的增删改查 1.创建一个表 CREATE(创建) TABLE(表) ENGINE(引擎) ENGINE=INNODB(引擎)还有很多类引擎,这里只是简单的提一下INNO ...
- Mysql数据库的数据类型、索引、锁、事务和视图
Mysql数据库的数据类型.索引.锁.事务和视图 数据的类型 1)数据类型: 数据长什么样? 数据需要多少空间来存放? 系统内置数据类型和用户定义数据类型 2)MySql 支持多种列类型: 数值类型 ...
- InnoDB 聚集索引和非聚集索引、覆盖索引、回表、索引下推简述
关于InnoDB 存储引擎的有聚集索引和非聚集索引,覆盖索引,回表,索引下推等概念,这些知识点比较多,也比较零碎,但是概念都是基于索引建立的,本文从索引查找数据讲述上述概念. 聚集索引和非聚集索引 在 ...
- MySQL数据库以及表的管理
MySQL数据库以及表的管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 今天我们探讨的话题就是如何使用MySQL做开发,我们运维的主要工作不是去开发SQL的,但尽管如此,我们有 ...
- MySQL数据库之表的增删改查
目录 MySQL数据库之表的增删改查 1 引言 2 创建表 3 删除表 4 修改表 5 查看表 6 复制表 MySQL数据库之表的增删改查 1 引言 1.MySQL数据库中,数据库database就是 ...
- Mariadb/MySQL数据库单表查询基本操作及DML语句
Mariadb/MySQL数据库单表查询基本操作及DML语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一数据库及表相关概述 1>.数据库操作 创建数据库: CREATE ...
- MySQL数据库INNODB 表损坏修复处理过程
MySQL数据库INNODB 表损坏修复处理过程 博客分类: mysql tomcatmysql 最近mysql数据库经常死掉,用命令net stop mysql命令也无法停掉,关闭Tomcat的时 ...
- MySQL基础知识:创建MySQL数据库和表
虚构一个微型在线书店的数据库和数据,作为后续MySQL脚本的执行源,方便后续MySQL和SQL的练习. 在虚构这个库的过程中,主要涉及的是如何使用命令行管理 MySQL数据库对象:数据库.表.索引.外 ...
随机推荐
- Java同步方法:synchronized到底锁住了谁?
目录 前言 同步方法 类的成员方法 类的静态方法 同步代码块 总结 其他同步方法 参考资料 前言 相信不少同学在上完Java课后,对于线程同步部分的实战,都会感到不知其然. 比如上课做实验的时候,按着 ...
- 大数据hbase分布式安装及其部署。
大数据hbase分布式安装及其部署. 首先要启动Hadoop以及zookeeper,可以参考前面发布的文章. 将hbase的包上传至master节点 这里我使用的是1.3.6的版本,具体的根据自己的版 ...
- foreach 里少用&$v
foreach ( $prize_list as $k => $v ) { $prize_list[$k]['prize_view'] = DB::name('dati_prize_catego ...
- 最新版navicat 12.1 破解(Keygen注册机)
最新注册机链接:https://pan.baidu.com/s/1fFCRkkXMzk6CFpbttCDr7w 提取码:40xo 1.下载安装Navicat 在Navicat关闭的情况下运行注册机 ...
- dhcp协议抓包分析
dhcp协议 DHCP,动态主机配置协议,前身是BOOTP协议,是一个局域网的网络协议,使用UDP协议工作,常用的2个端口:67(DHCP server),68(DHCP client). wires ...
- Linux利用sed批量修改文件名
初始文件名 # ls -lh total 5.5G -rw-r--r-- 1 root root 193K Sep 28 09:38 20180908.txt drwxr-xr-x 2 root ro ...
- 图像处理之OpenCV - 缩放/旋转/裁剪/加噪声/高斯模糊
Github地址 @ 缩放 void cv::resize ( InputArray src, OutputArray dst, Size dsize, , , int interpolation = ...
- P1460 健康的荷斯坦奶牛 Healthy Holsteins (简单的dfs)
题目描述 农民JOHN以拥有世界上最健康的奶牛为傲.他知道每种饲料中所包含的牛所需的最低的维他命量是多少.请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少. 给出牛所需的最低的维他命 ...
- 题解 bzoj 4398福慧双修(二进制分组)
二进制分组,算个小技巧 bzoj 4398福慧双修 给一张图,同一条边不同方向权值不同,一条边只能走一次,求从1号点出发再回到1号点的最短路 一开始没注意一条边只能走一次这个限制,打了个从一号点相邻节 ...
- Markdown更改字体、颜色、大小,设置文字背景色,调整图片大小设置居中,插入表格等方法
Markdown 通过简单标记语法,使普通文本内容具有一定格式.但它本身不支持修改字体.字号与颜色等功能的. 一.更改字体大小.颜色.更改字体 Markdown语法 <font face=&qu ...