mysql回表简介说明
下文笔者讲述mysql的回表简介说明,如下所示
回表简介
select获取数据,获得列中有非索引列
一次索引查询不能获取所有信息
需要到表中找到相应的列的信息
我们将这种情况称之为"回表"
换言之:
使用索引获取数据列,但无法获取全部数据,需借助索引去数据表中查询数据,
我们将这种不能通过索引一次性获取全部数据的操作称之为“回表”
例:
create table user( id bigint , name varchar(20), gender varchar(30), index(name), primary key(id) using btree )借助以上表设计,我们可以得出不需要回表的情况,如下所示
不需要回表情况
覆盖索引查询
当查询语句中的字段都包含在辅助索引中
且辅助索引覆盖了查询所需的所有字段
就不会触发回表操作
此时
MySQL可以直接从辅助索引中获取查询所需的数据,而无需回到主键索引
使用聚集索引进行查询
当查询语句使用聚集索引(即主键索引)进行查询
并且所需的字段都包含在聚集索引中,就不会触发回表操作
因为聚集索引中包含了完整的数据行
可直接从聚集索引中获取所需数据
例
要查出id为2数据
执行查询语句
此条SQL语句就不需要回表
由于使用主键查询方式
只需要搜索id这颗B+树
主键是唯一
根据这个唯一的索引
MySQL就能确定搜索的记录。
id为主键索引,主键索引是聚簇索引。
聚簇索引的叶子节点包含整个行记录
一次索引查询可获取所有的信息
故不需要回表
需要回表相关说明
SELECT语句使用非聚集索引
当查询语句使用非聚集索引(辅助索引)并需要返回非索引字段的值
就会触发回表操作
因为辅助索引中只包含索引列的值
而非索引字段的值存储在主键索引中
所以需要回到主键索引中获取完整的数据行。
查询包含不在索引中字段
当查询语句需要返回不在辅助索引中的字段
就会触发回表操作
因为辅助索引中只包含索引列的值
如果查询中需返回其他字段的值
此时需回到主键索引中获取完整的数据行
例
需回表查询的示例
查询name为索引的记录
使用查询语句select * from user where name = “猫猫”
此查询语句就会涉及回表操作
使用name获取主键信息,然后再使用主键信息获取表数据行
回表查询对性能的影响
回表对性能的影响
回表操作可能会影响查询性能
因为需要在辅助索引和主键索引之间进行额外的IO操作
特别是当查询的结果集包含辅助索引无法直接覆盖的列时
回表的开销更加明显
避免回表操作的方法
日常开发中应尽量避免过多的回表操作
可考虑使用覆盖索引(Covering Index)来优化查询
覆盖索引是指辅助索引包含了查询所需的所有列
这样查询就可以直接从辅助索引中获取所需的数据
而不需要回表操作
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


