我有以下查询:
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的每个组合找到第一个记录。
通常情况下,我可能会尝试这样的方法:
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输出中解释如下:
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如您所见,它必须查询大量记录才能构建子查询数据集,并且在连接到派生子查询时,没有找到索引,因此不使用索引。
发布于 2015-07-31 02:17:58
第一个查询需要这个复合索引:
INDEX(borrowerId, created, id)注意,MySQL很少为一个SELECT使用两个索引,但是复合索引通常非常方便。
第二个查询似乎效率很低。
请为每个表提供SHOW CREATE TABLE。
https://stackoverflow.com/questions/31728681
复制相似问题