首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql长执行查询

问Mysql长执行查询
EN

Stack Overflow用户
提问于 2016-05-17 16:35:16
回答 1查看 59关注 0票数 0

我有38k行的表,我使用这个查询来比较来自items表的item id和来自posted_domains表的item id。

代码语言:javascript
复制
select * from `items` 
where `items`.`source_id` = 2 and `items`.`source_id` is not null 
    and not exists (select * 
                    from `posted_domains` 
                    where `posted_domains`.`item_id` = `items`.`id` and `domain_id` = 1)
order by `item_created_at` asc limit 1

该查询采用了8s。我不知道我的查询是否有问题,或者我的mysql配置不好。此查询由Laravel关系生成,如

代码语言:javascript
复制
$items->doesntHave('posted', 'and', function ($q) use ($domain) {
    $q->where('domain_id', $domain->id);
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-17 16:43:01

相关子查询可能相当慢(因为它们经常被重复执行,对外部查询中的每一行执行一次),这可能会更快。

代码语言:javascript
复制
select * 
from `items` 
where `items`.`source_id` = 2 
   and `items`.`source_id` is not null 
   and item_id not in (
      select DISTINCT item_id 
      from `posted_domains` 
      where `domain_id` = 1) 
order by `item_created_at` asc 
limit 1

我说可能是因为在where中的子查询在MySQL中也比较慢。

这个左加入可能是最快的。

代码语言:javascript
复制
select * 
from `items` 
LEFT JOIN (
      select DISTINCT item_id 
      from `posted_domains` 
      where `domain_id` = 1) AS subQ
ON items.item_id = subQ.item_id
where `items`.`source_id` = 2 
   and `items`.`source_id` is not null 
   and subQ.item_id is null
order by `item_created_at` asc 
limit 1;

因为它是一个不匹配的场景,技术上它甚至不需要是子查询;并且作为一个直接的左联接可能更快,但这将取决于索引,可能还取决于实际的数据值。

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

https://stackoverflow.com/questions/37281866

复制
相关文章

相似问题

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