暂无图片
MYSQL 多表连接优化
我来答
分享
hzdba
2021-01-06
MYSQL 多表连接优化
暂无图片 10M

有一个sql如下,看结构是别名为RES的表跟别名为I,RES3,f的三个表进行jion和left jion,请教大神们这个sql可以怎么去优化吗,执行计划我放在后面
SELECT
RES.ID_,
RES.CREATETIME_,
RES.T_F_KEY_,
RES.P_F_ID_,
RES.P_I_ID_,
RES.ASSIGNEE_,
RES.NAME_,
RES.E_ID_,
RES3.TEXT_,
f.aTitle,
f.extString,
f.uId,
f.aId
FROM
A_U_K RES
LEFT JOIN (
SELECT DISTINCT
*
FROM
(
SELECT
T_ID_,
U_ID_ AS USER_ID
FROM
A_RU_IK I,
A_U_K T
WHERE
I.T_ID_ = T.ID_
AND TYPE_ = ‘candidate’
AND T.ASSIGNEE_ IS NULL
AND U_ID_ IS NOT NULL
AND TID_ IS NOT NULL
UNION
SELECT
T_ID_,
G_ID_ AS USER_ID
FROM
A_RU_IK I,
A_U_K T
WHERE
I.T_ID_ = T.ID_
AND TYPE_ = ‘candidate’
AND I.G_ID_ IS NOT NULL
AND I.T_ID_ IS NOT NULL
AND T.ASSEE_ IS NULL
) U
) I ON RES.ID_ = I.T_ID_
JOIN A_RU_VALE RES3 ON RES3.P_T_ID_ = RES.P_T_ID_
LEFT JOIN f_tance f ON f.processId = RES.P_T_ID_
AND f.STATUS = 1
WHERE
( RES.ASSEE_ LIKE ‘%ADMIN%’ OR I.U_ID LIKE ‘%ADMIN%’ )
AND RES3.NAME_ = ‘moduleId’
AND RES3.TEXT_ != ‘internal-list’
AND f.id is not null
ORDER BY
RES.CREATETIME_ DESC;

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
hzdba

执行计划如下:
图片.png
我现在弄不懂,这个sql怎么去改或者优化,因为RES表是分别跟另外三个表进行关联的,想要消除执行计划的Using temporary; Using filesort

暂无图片 评论
暂无图片 有用 0
打赏 0
Cui Hulong

从语句里看一下3个点可以先优化一下:
1.UNION 去掉 用or 语句匹配
2.LEFT JOIN 能否使用 inner join
3.LIKE 前面 %能不能去掉,看看能不能用上一些组合索引
4.那个表数据少 就用驱动表

这个要具体语句,一个一个匹配调试才可以

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
MySQL中Cache替换算法有哪些?
回答 1
已采纳
数据可以存放在CPU或者内存中。CPU处理速度快,但是容量少;内存容量大,但是转交给CPU处理的速度慢。为此,需要Cache来做一个折中。将最有可能调用数据先从内存Cache,CPU再从Cache读取
percona的mysql能用在生产上么?
回答 3
已采纳
是的,PerconaServerforMySQL可以用于生产环境中。PerconaServerforMySQL是一个开源的MySQL数据库服务器,它是基于MySQLCommunityEdition构建
查询 mysql 数据库记录时,如果存在多个索引, mysql 是选择最优的一个来使用,还是合并所有索引来执行呢?
回答 2
大多数情况都是选择最优。
MySQL一个业务字段只有2种值,需要用字典表吗?
回答 2
已采纳
comment加一个说明就可以了吧。字典表其实也是一个说明备注
mysql里用了函数AES_DECRYPT,如何解密一张大表然后再导入Oracle?
回答 1
MySQL里有AESENCRYPT()与AESDECRYPT()加解密对称函数。我理解通过解密函数解完在固定格式导出,导入到oracle就可以了。
writeset 和writeset_session生产中,如何选择?
回答 1
1、writeset适用于全局范围内检测和解决事务冲突的场景。常见用于多主架构下,多个主节点可以同时写入,并需要在全局范围内确保数据一致性。2、writesetsession适用于检测每个会话独立事务
MYSQL 怎么判断内存不够用?
回答 1
看bufferpool命中率应该算一个参考参数。
MySQL 如何根据sid查sql?
回答 3
showfullprocesslist;是不是你想要的结果。
mysql里数字相乘怎么处理?
回答 2
已采纳
用乘号就行了,比如58
mysql只有数据文件如何恢复
回答 1
mysql5.7采用mysqlfrm抽取.frm表结构,重新关联ibd文件mysql8可以用ibd2sql获取ibd中的表结构,再重新关联ibd文件,比较麻烦,做好备份更保准