mysql 多表关联查询性能优化-同一sql不同的执行计划

一、问题背景

相同的sql,不同的日期,执行的时间差异很大,执行计划不一样。执行快时,30ms左右。执行慢时,15s左右。

二、分析结论

1、经过分析,发现不同日期下,sql的执行计划不同,驱动表不同。sop作为驱动表时,执行速度快,sot作为驱动表时,执行速速慢。

2、驱动表确认原则,即小表原则。

3、如何确认大小表

以sop和sot两个表的关联为例。在现有查询条件不表的情况下

a、仅针对sop表进行查询,保留关联查询中所有有关sop表的查询条件,分析单查sop表的执行计划,查看对应的rows值。4.11日的扫描数据是11768,5.11日的扫描数据是15056。

b、仅针对sot表进行查询,保留关联查询中所有有关sot表的查询条件,分析单查sot表的执行计划,查看对应的rows值。扫描的数据是固定的,都是13952。

所以,4.11日关联查询,驱动表是sop。5.11日的关联查询,驱动表是sot。

三、解决方案

a、关联查询时,使用force index语法,强制指定索引

参考mysql多表查询,强制使用特定索引-CSDN博客

b、关联查询时,使用STRAIGHT_JOIN语法,强制指定驱动表

参考【性能提升神器】STRAIGHT_JOIN,指定驱动表-CSDN博客

相关推荐
疯华整猫10 小时前
删掉 LeakCanary 那天,我用 Trae 自己撸了一套:最难的不是分析堆,是决定什么时候 dump
android·人工智能·性能优化
新*10 小时前
Elasticsearch 7.17 的 SQL 到底能查到什么?一次踩坑记录
后端·sql·elasticsearch·查询
星恒随风14 小时前
MySQL 从零入门(四):表的增删改查与基础查询详解
linux·服务器·数据库·笔记·mysql
Pniubi16 小时前
MySQL靠什么实现事务的?事务隔离级别有哪些?
java·数据库·mysql
aiks_yuan17 小时前
MySQL 死锁怎么排查:看懂 INNODB STATUS 死锁日志,先查后插为什么必死锁(MySQL 8.2 实测)
mysql
洞见前行17 小时前
你的 Activity 关了,为什么还活着?Android 内存泄漏从发现、定位到线上治理
android·性能优化·leakcanary
进击的荆棘20 小时前
MySQL——库的操作
数据库·mysql
计算机毕设定制辅导-无忧学长20 小时前
《基于Spring Boot的迷游哈游戏综合服务平台的开发》
java·vue.js·spring boot·mysql·迷游哈游戏综合服务平台
这个DBA有点耶1 天前
库内计算推理:一条SQL背后的算子融合,和外挂方案差了几次网络往返
数据库·人工智能·sql
新*1 天前
从一段 WebSocket 代码聊开:bytes 不是 zlib、binaryType 决定一切,15MB 大消息的零拷贝优化
javascript·python·websocket·性能优化·blob·zlib·arraybuffer