首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果sql子查询太多,如何优化?

如果sql子查询太多,如何优化?
EN

Stack Overflow用户
提问于 2022-04-25 10:16:02
回答 2查看 38关注 0票数 0

如果表数据库是这样的

设备表

代码语言:javascript
复制

device_id device_uuid device_status

1001 00000脱机

1002 00000在线

1003 11111脱机

1004 11111脱机

代码语言:javascript
复制

任务表

代码语言:javascript
复制

task_id device_id task_value

50001 1001清洗

50002 1001清洗

50003 1004清洗

代码语言:javascript
复制

我的sql

代码语言:javascript
复制
select t.* 
from task t 
where t.device_id in (select device_id 
                      from device d1 
                      where d1.device_uuid in (select device_uuid 
                                               from device d 
                                               where d.device_status = 'online'
                                              )
                     )

如何优化?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2022-04-25 10:23:48

您可以使用JOINEXISTS

代码语言:javascript
复制
select t.* 
from task t 
where exists (select 1 
              from device d1 
              where d1.device_id = t.device_id and 
                    d1.device_status = 'online'
             ); 
票数 1
EN

Stack Overflow用户

发布于 2022-04-25 17:34:18

使用JOINs。模仿你的想法--“先找到‘在线’设备,然后.”:

代码语言:javascript
复制
SELECT  t.*
    FROM  device d
    JOIN  device d1 USING(device_uuid)
    JOIN  task t USING(device_id)
    WHERE  d.device_status = 'online';

我不清楚是否需要两次接触device。也许这就足够了:

代码语言:javascript
复制
SELECT  t.*
    FROM  device d
    JOIN  task t USING(device_id)
    WHERE  d.device_status = 'online';

注:

代码语言:javascript
复制
FROM a JOIN b  USING(x)

是一个缩写

代码语言:javascript
复制
FROM a JOIN b  ON b.x = a.x

还有一个问题--指数。一定要有这些;如果表很大,它们将有很大的帮助:

代码语言:javascript
复制
device:  INDEX(device_status, device_id)
task:    INDEX(device_id)

另一个注意事项:关键字INNEROUTER在MySQL中没有功能,因此我忽略了它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71997924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档