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)来优化查询 覆盖索引是指辅助索引包含了查询所需的所有列 这样查询就可以直接从辅助索引中获取所需的数据 而不需要回表操作
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。