基本上,我有 2 个表:用户和对象。一个用户可以通过三种方式(角色)关联到一个对象。我想按任何角色列出至少与一个业务对象相关联的所有用户。
此查询有效,但需要 5 秒!
SELECT u.id
FROM user u
LEFT JOIN translation_revision t1
ON u.id = t1.translator_id
LEFT JOIN translation_revision t2
ON u.id = t2.proofreader_id
LEFT JOIN translation_revision t3
ON u.id = t3.reviewer_id
wHERE t1.id IS NOT NULL
OR t2.id IS NOT NULL
OR t3.id IS NOT NULL
GROUP BY u.id
在这里完成创建和数据的摆弄:https ://www.db-fiddle.com/f/nojYaUsWicKJDuRQk1Nqd2/7
关于如何在这里提高性能的任何想法?
您可以通过简单地使用 OR 子句来完成相同的事情,而不是执行 3 个单独的连接(执行时间似乎是 ~1-2ms):
其他想法是非规范化您的数据并保留一些有关您的用户角色的附加信息。
我的速度很快,在 1-2 毫秒(在 5.5 和 8.0 之间的各种版本以及 MariaDB 之间进行了测试):
(我更喜欢使用
DISTINCT
而不是GROUP BY
,但可能没有性能差异。)也许只是
?
您可以使用 union all 来避免排序