什么是回表操作?
劳烦帮忙举个例子,详细讲解一下什么是回表操作,谢谢。
收藏
复制链接
微信扫码分享
在小程序上查看
分享
4条回答
默认
最新

执行这个sql的执行计划,可以看到,走了aa索引,可以看到一个index range scan,并且还有一个table access by index rowid BATCHED,这个就是回表扫描了。执行流程是这样的,先从aa索引块里找到id2=1的数据,由于索引里只有id2的值,要拿到其他列值,需要通过索引里的rowid去表里检索到这一列的其他字段
评论
有用 1
评论
有用 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回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
墨值悬赏


