Ger*_*rdo 4 mysql performance group-by
这是我正在执行的查询(没有一些不相关的联接):
SELECT a.*, c.id
FROM a
LEFT OUTER JOIN b ON a.id = b.id_anunciante
LEFT OUTER JOIN c ON c.id = b.id_rubro
GROUP BY a.id
Run Code Online (Sandbox Code Playgroud)
每行"a"与"b"中的1到5行链接.
问题是GROUP BY存在性能问题(使用GROUP BY需要10倍或更多而不是使用它).我需要在"a"中只检索每个成员的一行.
我怎样才能让它更快?
编辑:我需要能够通过a.id和/或c.id进行过滤.我应该得到的结果集是"a"的每个"有效"成员只有1行,这意味着匹配约束的行.不应返回与过滤器不匹配的行.在我的原始查询中,这将以这种方式完成:
SELECT a.*, c.id
FROM a
LEFT OUTER JOIN b ON a.id = b.id_anunciante
LEFT OUTER JOIN c ON c.id = b.id_rubro
WHERE c.id = 1
OR a.id = 1
GROUP BY a.id
Run Code Online (Sandbox Code Playgroud)
a.id,b.id_anunciante,b.id_rubro,c.id都是索引.
SELECT a.*,
(
SELECT c.id
FROM b
JOIN ?
ON c.id = b.id_rubro
WHERE b.id_anunciante = a.id
-- add the ORDER BY condition to define which row will be selected.
LIMIT 1
)
FROM a
Run Code Online (Sandbox Code Playgroud)
b (id_anunciante)为此创建索引以更快地工作.
更新:
你不需要OUTER JOINs这里.
重写您的查询,如下所示:
SELECT a.*, c.id
FROM a
JOIN b
ON b.id_anunciante = a.id
JOIN c
ON c.id = b.id_rubro
WHERE a.id = 1
UNION ALL
SELECT a.*, 1
FROM a
WHERE EXISTS
(
SELECT NULL
FROM c
JOIN b
ON b.id_rubro = c.id
WHERE c.id = 1
AND b.id_anunciante = a.id
)
Run Code Online (Sandbox Code Playgroud)