MySQL 回表查询 性能代价?如何避免?

一、什么是回表查询?

  1. 二级索引只会存储索引和主键,当通过二级索引查找数据时,如果想要找到其他列的数据就会拿着主键去聚簇索引里查询整行数据,这个过程就是回表

二、回表的性能代价?

  1. 回表不只是多了一次查询,而是多了很多次的随机IO操作
  2. 因为二级索引是根据索引的值排序的,二聚簇索引是根据主键的值进行排序的。
  3. 比如查询age=20的人的信息,可能会查到不同无序的id,拿着这些id去聚簇索引查询会定位到不同的数据页,产生大量的随机IO。
  4. 顺序IO可以利用磁盘预读,一次读取一大片的数据,而随机IO每次都会定位到不同的数据页,效率大大降低。

三、如何避免回表?

  1. 避免使用select * ,如果返回的列正好是索引的列,尽量写出列名,从而避免回表查询。
  2. 用覆盖索引,联合索引的列包含所有返回的列
  3. 索引下推

四、什么时候MySQL会放弃索引直接回表查询?

  1. 如果回表次数太多,可能会放弃索引而使用全表扫描
  2. 如果返回的数据量超过了表的15%-30%,优化器可能会放弃二级索引,因为会回表产生太多随机IO不如直接全表扫描

五、一个查询走了索引但还是慢的原因是什么?

  1. 大概率是回表次数太多,产生大量随机IO。
  2. 利用explain 查看row 如果很高,代表回表代价高
  3. 优化办法就是使用覆盖索引,或者缩小结果集。

六、怎么判断一个查询到底有没有走索引?

  1. 使用explain,看extra列,using index表示使用了覆盖索引,没有回表查询,如果using index condition说明用到了索引下推,有回表。
  2. type 是index 全索引扫描,也有可能回表。

七、主键查询要回表吗?

  1. 回表查询只发生在二级索引中
  2. 主键查询是聚簇索引,叶子节点存的就是正行数据,所以不需要回表。
相关推荐
马克Markorg5 小时前
常见的向量数据库和具有向量数据库能力的数据库
数据库
Coder_Boy_7 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
helloworldandy7 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
数据知道9 小时前
PostgreSQL 故障排查:如何找出数据库中最耗时的 SQL 语句
数据库·sql·postgresql
qq_12498707539 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
枷锁—sha9 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
Coder_Boy_9 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Gain_chance9 小时前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
此生只爱蛋9 小时前
【Redis】主从复制
数据库·redis
马猴烧酒.10 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库