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数据库对象:数据库.表.索引.外 ...
随机推荐
- C#多线程(13):任务基础①
目录 多线程编程 多线程编程模式 探究优点 任务操作 两者创建任务的方式 Task.Run() 创建任务 取消任务和控制任务的创建 任务返回结果以及异步获取返回结果 捕获任务异常 全局捕获任务异常 多 ...
- RSA,AES加解密算法的实现
目录 Python实现RSA公钥加密算法 RSA公钥加密算法原理 RSA算法的Python实现 AES加解密算法实现 AES加解密算法原理 AES加解密算法Python实现 参考文献 Python实现 ...
- JDK12的五大重要新特性
文章目录 JDK12的五大重要新特性 引入JVM常量API 扩展了switch语句 支持Unicode 11.0 为日本Reiwa Era提供了方形字符支持 NumberFormat增加了对以紧凑格式 ...
- XEP-0199 XMPP Ping
原文来自:https://xmpp.org/extensions/xep-0199.html,只翻译了技术方面的内容. 摘要:这个规范定义了一个通过XML流发送应用级别pings的XMPP扩展协议.这 ...
- PAT A1023
简单的大数问题,long long并不能容纳21位数字,这是刚开始没有注意到的 #include<iostream> #include<stdlib.h> #include&l ...
- uboot on qemu
1, download uboot ftp://ftp.denx.de/pub/u-boot/ 2, compile uboot make vexpress_ca9x4_config export A ...
- 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 ...
- 数学--数论--HDU1222 狼和兔子(最大公约数)
问题描述 有一座周围有n个洞的小山.孔从0到n-1有符号. 兔子必须藏在其中一个洞中.狼以逆时针方向搜索兔子.他第一个进入的洞是一个用0签名的洞.然后,他将每m个洞进入一个洞.例如,m = 2和n = ...
- 图论--最长路--基于SPFA的调整模板
#include<iostream> #include<queue> #include<algorithm> #include<set> #includ ...
- CodeForces - 1245 C - Constanze's Machine
Codeforces Round #597 (Div. 2) Constanze is the smartest girl in her village but she has bad eyesigh ...