mysql回表简介说明

欣喜 Java每日一问 发布时间:2024-07-09 10:27:38 阅读数:1859 1
下文笔者讲述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)来优化查询
	  覆盖索引是指辅助索引包含了查询所需的所有列
	  这样查询就可以直接从辅助索引中获取所需的数据
	   而不需要回表操作
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaProblem/202407/8128.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者