网站开发流程图软件,电影网站排名怎么做,张家港网站制作公司,著名网站设计师#x1f3c6;作者简介#xff0c;黑夜开发者#xff0c;全栈领域新星创作者✌#xff0c;CSDN博客专家#xff0c;阿里云社区专家博主#xff0c;2023年6月CSDN上海赛道top4。 #x1f3c6;数年电商行业从业经验#xff0c;历任核心研发工程师#xff0c;项目技术负责… 作者简介黑夜开发者全栈领域新星创作者✌CSDN博客专家阿里云社区专家博主2023年6月CSDN上海赛道top4。 数年电商行业从业经验历任核心研发工程师项目技术负责人。 本文已收录于PHP专栏MySQL的100个知识点。 欢迎 点赞✍评论⭐收藏 文章目录 一、什么是MySQL的回表二、什么情况下会触发回表2.1 索引不Cover所有需要查询的字段2.2 使用了非聚簇索引2.3 使用了覆盖索引但超过了最大索引长度 三、哪些情况下不会触发回表3.1 覆盖索引3.2 使用聚簇索引 四、回表操作的问题和场景4.1 性能问题4.2 数据一致性4.3 是否使用覆盖索引的判断 五、总结 一、什么是MySQL的回表 在MySQL数据库中回表Look Up指的是在进行索引查询时首先通过索引定位到对应页然后再根据行的物理地址找到所需的数据行。换句话说回表是指根据索引查询到的主键值再去访问主键索引从而获取完整的数据记录。 二、什么情况下会触发回表
MySQL的回表操作通常在以下情况下会发生
2.1 索引不Cover所有需要查询的字段
当查询语句中需要返回的列不在索引列上时即使通过索引定位了相关行仍然需要回表获取其他列的值。
2.2 使用了非聚簇索引
非聚簇索引Secondary Index只包含了索引列的副本以及指向对应主键的引用查询需要通过回表才能获取完整的行数据。 2.3 使用了覆盖索引但超过了最大索引长度
在MySQL的InnoDB存储引擎中每个索引项的最大长度是767字节如果查询需要返回的字段长度超过了该限制同样会触发回表操作。
需要注意的是回表操作主要发生在读取操作SELECT中写入操作INSERT、UPDATE、DELETE一般不会触发回表。
三、哪些情况下不会触发回表
在某些特殊情况下MySQL的回表操作可以被避免
3.1 覆盖索引
如果查询的字段都在某个索引上并且没有超过最大索引长度限制MySQL可以直接从索引中获取所需数据而无需回表。
3.2 使用聚簇索引
InnoDB存储引擎的主键索引是聚簇索引它包含了整个行的数据。当查询条件使用了主键或者通过主键查询时MySQL可以直接从主键索引中获取所有需要的数据无需回表。 四、回表操作的问题和场景
回表操作虽然提供了更全面的数据信息但也带来了一些问题和局限性。
4.1 性能问题
回表操作通常需要访问两次索引增加了IO开销和CPU消耗对查询性能有一定的影响。特别是在高并发、大数据量的情况下回表可能成为性能瓶颈。
4.2 数据一致性
由于回表操作是基于物理地址来获取数据如果在回表过程中发生了数据修改如DELETE、UPDATE则可能会读取到不一致或错误的数据。
4.3 是否使用覆盖索引的判断
在选择是否使用覆盖索引时需要综合考虑查询的字段以及字段长度以及查询操作的频率和数据量。如果查询需要返回的字段较多或字段长度较长可能需要权衡回表带来的性能损耗和数据完整性的需求。
在实际应用中我们可以根据具体的场景来决定是否使用回表操作。下面列举了一些使用回表的典型场景 需要返回更全面的数据有些查询场景下返回的字段可能不仅仅是索引所包含的列此时回表可以提供更全面的数据信息。 使用非聚簇索引当表中没有定义主键或者查询条件没有使用主键时非聚簇索引成为主要的索引选择但回表操作则难以避免。 超过最大索引长度限制如果需要返回的字段长度超过了最大索引长度限制即使使用了覆盖索引也无法避免回表此时需要注意回表带来的性能损耗。 五、总结
综上所述MySQL的回表操作是在索引查询时通过主键索引再次访问以获取完整数据记录的过程。