暂无图片
分享
yBmZlQzJ
2022-11-22
什么是回表操作?

劳烦帮忙举个例子,详细讲解一下什么是回表操作,谢谢。

收藏
分享
4条回答
默认
最新
李宏达

image.png
执行这个sql的执行计划,可以看到,走了aa索引,可以看到一个index range scan,并且还有一个table access by index rowid BATCHED,这个就是回表扫描了。执行流程是这样的,先从aa索引块里找到id2=1的数据,由于索引里只有id2的值,要拿到其他列值,需要通过索引里的rowid去表里检索到这一列的其他字段

暂无图片 评论
暂无图片 有用 1
暂无图片
yBmZlQzJ
题主
2022-11-22
那是不是我 select id2 from test where id2=1 这个SQL 就不会执行回表操作了?

要弄懂回表操作,先弄懂索引结构。

https://www.51cto.com/article/699015.html


暂无图片 评论
暂无图片 有用 0
大大刺猬

介绍:
mysql的普通索引存储的是索引字段和主键值(节省空间), 当查询的字段不在普通索引上时, 就会根据普通索引记录的主键值"回表"去查询主键索引.然后得到目标字段数据.
注:主键索引记录了主键值和该行所有字段值(不含LOB), 主键索引也叫簇集索引(cluster index).

例子:
假设有如下表结构

CREATE TABLE `t20221122` ( `id` int(11) NOT NULL, `name` varchar(30) DEFAULT NULL, `age` int(11) DEFAULT NULL, `dream` varchar(20) NOT NULL, PRIMARY KEY (`id`), KEY `idx_name_age` (`name`,`dream`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into t20221122 values(1, 'u1', 22, 'eat'); insert into t20221122 values(2, 'u2', 22, 'sleep'); insert into t20221122 values(3, 'u3', 22, 'stander');

当执行如下SQL时就会回表, 因为"dream"字段不在索引"idx_name_age"上, 所以会先得到 name=‘u2’ 的主键值, 然后根据主键值去查询目标字段, 从而得到数据.
select dream from t20221122 where name='u2';

(root@127.0.0.1) [db1]> explain select dream from t20221122 where name='u2'; +----+-------------+-----------+------------+------+---------------+--------------+---------+-------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+------+---------------+--------------+---------+-------+------+----------+-------------+ | 1 | SIMPLE | t20221122 | NULL | ref | idx_name_age | idx_name_age | 93 | const | 1 | 100.00 | Using index | +----+-------------+-----------+------------+------+---------------+--------------+---------+-------+------+----------+-------------+ 1 row in set, 1 warning (0.00 sec)
暂无图片 评论
暂无图片 有用 0
yBmZlQzJ
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏