首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化联接中的子查询

问优化联接中的子查询
EN

Stack Overflow用户
提问于 2015-07-30 15:59:00
回答 1查看 42关注 0票数 0

我有以下查询:

代码语言:javascript
复制
SELECT *
FROM s
JOIN b ON s.borrowerId = b.id
JOIN (
    SELECT MIN(id) AS id
    FROM tbl
    WHERE dealId IS NULL
    GROUP BY borrowerId, created
) s2 ON s.id = s2.id

是否有一种简单的方法对此进行优化,以便我可以直接进行连接并利用索引?

更新

created字段是GROUP BY语句的一部分,因为由于我们的MySQL版本和正在使用的ORM的限制,有可能拥有具有相同created时间戳值的多个记录。因此,我需要为borrowerId和created的每个组合找到第一个记录。

通常情况下,我可能会尝试这样的方法:

代码语言:javascript
复制
SELECT *
FROM s
INNER JOIN b ON s.borrowerId = b.id
LEFT OUTER JOIN s2
    ON s.borrowerId = s2.borrowerId
    AND s.created = s2.created
    AND s.id <> s2.id
    AND s.id < s2.id
WHERE s2.id IS NULL
AND s.dealId IS NULL;

但我不确定这是否能达到我想要的效果。

从MySQL输出中解释如下:

代码语言:javascript
复制
1   PRIMARY b   ALL NULL    NULL    NULL    NULL    129690  
1   PRIMARY <derived2>  ALL NULL    NULL    NULL    NULL    317751  Using join buffer
1   PRIMARY s   eq_ref  PRIMARY,borrowerId_2,borrowerId PRIMARY 4   s2.id   1   Using where
2   DERIVED statuses    ref dealId  dealId  5       183987  Using where; Using temporary; Using filesort

如您所见,它必须查询大量记录才能构建子查询数据集,并且在连接到派生子查询时,没有找到索引,因此不使用索引。

EN

回答 1

Stack Overflow用户

发布于 2015-07-31 02:17:58

第一个查询需要这个复合索引:

代码语言:javascript
复制
INDEX(borrowerId, created, id)

注意,MySQL很少为一个SELECT使用两个索引,但是复合索引通常非常方便。

第二个查询似乎效率很低。

请为每个表提供SHOW CREATE TABLE。

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

https://stackoverflow.com/questions/31728681

复制
相关文章

相似问题

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