针对多对多加入标记优化MySQL查询

时间:2012-10-03 08:50:12

标签: mysql sql query-optimization

我需要选择链接到特定标签的所有文章,但我还希望所有其他标签与每篇文章相关联。由于我的SQL知识有限,我做了以下MySQL查询,但是看起来效率不高。

SELECT a.id, a.name, c.id AS topic_id, c.name AS topic, GROUP_CONCAT(t.id) AS tag_ids, GROUP_CONCAT(t.name) AS tags, a.description
FROM tag t 
LEFT JOIN artifacts_tags j ON t.id = j.tag_id
LEFT JOIN artifact a ON a.id = j.artifact_id
LEFT JOIN topic c ON c.id = a.topic_id

LEFT JOIN artifacts_tags aj ON a.id = aj.artifact_id
LEFT JOIN tag ts ON ts.id = aj.tag_id
WHERE ts.slug = 'summer'
AND a.is_public = 1 
GROUP BY a.id

如果有人能提出更有效的查询,我将不胜感激。

实际上,我还需要类似的标签(所有标签都属于slug'wall'标签所属的主题),但我还有另一个查询。如果我可以使用相同的查询获得类似的标签会更好,但我不知道如何。表tagtopic表具有多对一关系。

1 个答案:

答案 0 :(得分:0)

非确定性GROUP BY: SQL检索既不在聚合函数中也不在GROUP BY表达式中的列,因此这些值在结果中将是不确定的。

不同表格上的GROUP BY: 这将强制使用临时表和filesort,这可能是一个巨大的性能问题,并且可能会占用磁盘上的大量内存和临时空间。