如何改进复杂而糟糕的SQL查询

时间:2012-06-09 20:54:36

标签: mysql sql

我有一个消息传递应用程序的表格:

`messaging_message`
 - thread_id
 - content
 - timestamp
 - sender_id 

`messaging_messagestatus`
 - thread_id # though redundant here, makes messaging queries much easier
 - message
 - recipient_id
 - status

一些注意事项:

  • 每条消息都有两个引用它的messagestatus条目,一个用于消息线程中的每个用户。
  • 单个邮件主题中可能有多条消息。
  • 用户可以删除邮件(status ='已删除'),删除邮件的用户显然不会删除该帖子中其他用户的相同邮件。

利用SQL的基本知识尽我所能,我创建了一个查询来获取:

给定一个用户,获取所有不同的未删除线程,显示1)thread_id; 2)message_id // 3)时间戳// 4)该线程中最新消息的内容; 5)消息线程中的另一个人是谁; 6)用户是否发送了最新消息。以下是我到目前为止的情况:

SELECT thread_id, message_id, timestamp, content,
(SELECT DISTINCT recipient_id FROM messaging_messagestatus ms WHERE ms.thread_id=thread_id     
  AND recipient_id !=4) as other_recipient,
(CASE WHEN sender_id=4 THEN True ELSE False END) as sent_last_message

FROM
( SELECT m.thread_id, recipient_id, timestamp, m.id as message_id, content, sender_id
    FROM messaging_messagestatus ms
    INNER JOIN messaging_message m
    ON ms.message_id = m.id
WHERE recipient_id = 4 AND m.thread_id NOT in 
    ( SELECT thread_id FROM messaging_messagestatus WHERE status='deleted' 
      AND recipient_id = 4)

ORDER BY timestamp DESC) combined GROUP BY thread_id

此查询有效,并会给我一些类似的内容:

thread_id   message_id  timestamp       content         other_recipient   sent_last_message
2           3       2012-06-09 13:02:08 newest message  80                 1

大约有20k条消息行/ 35k状态行,第一个查询大约需要14秒!关于3s的后续查询。

1 个答案:

答案 0 :(得分:0)

您应该合并这些表。拥有两个具有这种直接相关数据的独立表格并不是很好的编程。这将消除这两个数据源之间的任何连接,并使查询数据更容易,更快。