【发布时间】:2016-09-02 20:57:57
【问题描述】:
我目前在新工作中继承的旧版应用程序存在问题。我有一个 SQL 查询太长而无法响应,我需要找到一种方法来固定它。 此查询作用于 3 个表:
- SESSION 包含所有用户访问
- CONTACT 包含人们通过表单发送的所有消息,并包含一个链接回 SESSION id 字段的“session_id”字段
- ACCOUNT 包含用户帐户(在网站上注册的人),并且其“id”字段在 SESSION 中链接回(通过“SESSION.account_id”字段)。除了 SESSION 表(旧版应用...)之外,ACCOUNT 和 CONTACT 没有任何关联。
很遗憾,我无法更改此结构。
我的查询尝试恢复所有有趣的会话以提供给管理员。我需要找到链接回帐户或联系表单的所有会话。
目前,查询的结构如下:
SELECT s.id
/* a few fields from ACCOUNT and CONTACT tables */
FROM session s
LEFT JOIN account act ON act.id = s.account_id
LEFT JOIN contact c on c.session_id = s.id
WHERE s.programme_id = :program_id
AND (
c.id IS NOT NULL
OR
act.id IS NOT NULL
)
问题是,SESSION 表增长得非常快(正如您所料),并且有 40 万条记录,它会减慢某些程序的速度(查询中的 :programme_id)。
我尝试使用带有两个 INNER JOIN 查询的 UNION 查询,一个在 SESSION 和 ACCOUNT 之间,另一个在 SESSION 和 CONTACT 之间,但它没有给我相同数量的记录,我真的不明白为什么.
有人可以帮我找到一个更好的方法来进行这个查询吗?
非常感谢。
【问题讨论】: