吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1108|回复: 8
收起左侧

[求助] sql请教

[复制链接]
ppgjx 发表于 2022-4-24 14:56
原sql

select dct.task_id , dct.device_id , dct.cmd , dct.create_time , dct.exec_time ,dct.result_time , dct.task_status ,dct.push_count
        , dv.token , dv.unlock_token,dv.magic,dv.topic,dv.`status` as device_status,dv.cert_id,ci.p12_path,ci.p12_password,ci.cert_status from
        device_command_task dct LEFT JOIN device_info dv on dct.device_id = dv.device_id LEFT JOIN cert_info ci on dv.cert_id = ci.cert_id where dv.device_id in  (select device_id from device_info where status = "TokenUpdate")


用到了子查询 我知道子查询非常影响性能 有办法优化吗?

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

hrjmo 发表于 2022-4-24 15:04
如果数据量很大,on条件用到的字段可以加索引。
sjdzy 发表于 2022-4-24 15:04
可以尝试用left join替代in   eg: select t1.c1 ,t1.c2 from t1 left join t2 on t1.id = t2.id where  t2.id  is not null   
邓振振 发表于 2022-4-24 15:05
select dct.task_id , dct.device_id , dct.cmd , dct.create_time , dct.exec_time ,dct.result_time , dct.task_status ,dct.push_count
        , dv.token , dv.unlock_token,dv.magic,dv.topic,dv.`status` as device_status,dv.cert_id,ci.p12_path,ci.p12_password,ci.cert_status from
        device_command_task dct LEFT JOIN device_info dv on dct.device_id = dv.device_id and dvstatus = "TokenUpdate" LEFT JOIN cert_info ci on dv.cert_id = ci.cert_id

尽量不用in,你left后加and就行了。在看下执行计划应该有优化的控件,无非就加合适的索引

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
ppgjx + 1 + 1 热心回复!

查看全部评分

a397555462 发表于 2022-4-24 15:05
第 一个为啥不用 inner join ?
 楼主| ppgjx 发表于 2022-4-24 15:11
邓振振 发表于 2022-4-24 15:05
select dct.task_id , dct.device_id , dct.cmd , dct.create_time , dct.exec_time ,dct.result_time , dc ...

这个sql语句和我查的不一样呀
JasonJHu 发表于 2022-4-24 15:12
试试用exists来替代in,它只要找到一条满足的就会返回true
gahdxbg 发表于 2022-4-24 17:44
学习中11111111111111111111
sphinx_young 发表于 2022-5-6 11:23
select dct.task_id,
       dct.device_id,
       dct.cmd,
       dct.create_time,
       dct.exec_time,
       dct.result_time,
       dct.task_status,
       dct.push_count,
       dv.token,
       dv.unlock_token,
       dv.magic,
       dv.topic,
       dv. status as device_status,
       dv.cert_id,
       ci.p12_path,
       ci.p12_password,
       ci.cert_status
  from device_command_task dct
  inner JOIN device_info dv
    on (dct.device_id = dv.device_id and dv.status = 'TokenUpdate')
  LEFT JOIN cert_info ci
    on dv.cert_id = ci.cert_id

dct.device_id、dv.device_id、dv.cert_id 、 ci.cert_id 增加索引。
如果依然效率不高且dv.status = 'TokenUpdate'数据条数占比不超过50%,建议将dv.status 增加索引。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 11:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表