暂无图片
mysql5.7,一个查询执行很慢
我来答
分享
金豆
2021-01-26
mysql5.7,一个查询执行很慢
select a.* from t_3ioj4GeZQU a where status='A' AND batch_Id in( SELECT batch_id from batch_log b LEFT JOIN office o ON b.dept_id = o.ID LEFT JOIN area a on o.AREA_ID = a.ID WHERE target = '21' AND (o.OFFICE_CODE = '130100' or a.AREA_CODE = '130100') ) ORDER BY XK_JDRQ DESC
复制

下面是执行计划:
explain.png

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

E1.png

暂无图片 评论
暂无图片 有用 0
打赏 0
金豆

E2.png

暂无图片 评论
暂无图片 有用 0
打赏 0
章芋文

t_3ioj4GeZQU表有多少数据量,status='A’有多少数据量,in查询最后的结果集有多少条?,最后满足条件的有多少条数据?

如果不考虑数据量,最大的问题就是从了STATUS的索引,如果batch_Id选择性更好,可以走这个索引。

暂无图片 评论
暂无图片 有用 0
打赏 0
金豆

t_3ioj4GeZQU有106万数据,加A之后68.5万,in的结果集有5.5多数据,耗时90s

暂无图片 评论
暂无图片 有用 0
打赏 0
章芋文

5.5万条吗?

把status,batch_Id的联合索引,换成batch_Id,status试试。

暂无图片 评论
暂无图片 有用 0
打赏 0
金豆

是的5.5多条

暂无图片 评论
暂无图片 有用 0
打赏 0
文成
select a.* from  t_3ioj4GeZQU a
join (
SELECT 
		batch_id from batch_log b 
		LEFT JOIN office o  ON b.dept_id = o.ID
		LEFT JOIN area a on o.AREA_ID = a.ID
		WHERE target = '21' 
	      	AND (o.OFFICE_CODE = '130100' or a.AREA_CODE = '130100')
) aa
 where  status='A' AND batch_Id  aa.batch_Id  
		ORDER BY XK_JDRQ DESC
复制

试试这样

暂无图片 评论
暂无图片 有用 0
打赏 0
金豆

好的,我试一下,谢谢

暂无图片 评论
暂无图片 有用 0
打赏 0
金豆

我发现一个情况,就是不加ORDER BY XK_JDRQ DESC查询只需要6秒多,加了需要60多秒,这种情况是不是给XK_JDRQ 加个索引

暂无图片 评论
暂无图片 有用 0
打赏 0
老紫竹

1、子表里,如果不确认batch_id是唯一的,可以加上distinct
比如
select distinct batch_id from batch_log

2、5.5万行数据,你可以先创建一个临时表,然后再排序分成2步看看性能
create table tmp as select… 不要order
然后单独 select * from tmp order by
看看是否真的和你测试的,order就花费了60秒。

当然你的索引我怀疑没啥用。因为是先通过索引扫描到行,然后内部是并行join,这里数据就被打乱了,最后在join结果集上再排序返回。 原始表的排序列索引预计无效。

怎么看5.5万行也不是很多啊,怎么会花费这么多。是不是内部串行了? 我看资料mysql 8支持并行度。

3、select * 可以减少下字段数量看看,是不是字段太多了导致排序时,花费了额外的时间。如果确认,那也没法办法。

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


请输入正文
提交
相关推荐
cpu使用率高,从db层面收集那些信息?最好有命令,有例子方便学习
回答 1
推荐你一个工具【innotop】可以很方便观察当前线程运行情况(yum可直接安装)。通常线上问题,CPU飙高大多会伴随着慢查询(重点关注哪些扫描行数比较多的SQL)增多,threadrunning(s
怎么查MySQL内存用量,使用量?
回答 2
已采纳
全局内存设置SELECTROUND(@@keybuffersize/1024/1024,2)asKEYBUFMB,ROUND(@@innodbbufferpoolsize/1024/1024,2)as
MySQL数据库碎片如何清除?
回答 3
已采纳
altertable表名engineInnoDB是解决方案。预防是id自增,最好别删除。表有分区,过期drop分区。
MySQL5.7 不能通过127.0.0.1登录,而可以localhost登录 等问题总结
回答 2
可以增加一个127.0.0.1这个IP的授权
percona的mysql tool有更轻量级的吗?这个工具太大太重
回答 1
已采纳
没有哦,下载一次,保存下来
MySQL Open_tables 打开的表数量已经超过table_open_cache设置的值 ,需要调整吗?
回答 1
已采纳
可以参考openfileslimitTableopencache2
mysql innodb cluster怎样扩展?
回答 3
你这2000的并发,先不要考虑用户了。到了20000的时候在考虑吧
MySQL数据库频繁宕机故障
回答 6
看看主从复制那款呢
有个mycat下面有100个分片借点,假如现在我第100个节点宕机,那请问本来应该写入第100号节点的数据会怎样
回答 2
1.对于应用来说是丢失链接,因为应用的请求是通过mycat去分发的。应用只会认为,mysql无法连接,执行的事务失败。2.对于mysql来说突然宕机,对于宕机的服务器来说,内存的东西丢掉了,写入日志的
MySQL如何避免死锁?
回答 1
已采纳
避免死锁应注意以下几点:1)以固定的顺序访问表和行。比如两个任务批量更新的情形,简单方法是对id列表先排序,后执行,这样就避免了交叉等待锁的情形;又比如将两个事务的SQL顺序调整为一致,也能避免死锁。