【发布时间】:2017-05-26 06:02:34
【问题描述】:
我正在对三个表 messages、message_recipients 和 users 运行查询。
messages表的表结构:
id int pk
message_id int
message text
user_id int
...
此表的索引位于 user_id、message_id 和 id。
message_recipients表的表结构:
id int pk
message_id int
read_date datetime
user_id int
...
索引位于id、message_id 和user_id。
users表的表结构:
id int pk
display_name varchar
...
索引位于id。
我正在对这些表运行以下查询:
SELECT
m.*,
if(m.user_id = 0, 'Campus Manager', u.display_name) AS name,
mr.read_date,
IF(m1.message_id > 0 and m1.user_id=1, true, false) as replied
FROM
messages m
JOIN
message_recipients mr
ON
mr.message_id = m.id
LEFT JOIN
users u
ON
u.UID = m.user_id
LEFT JOIN
messages m1
ON
m1.message_id = m.id
WHERE
mr.user_id = 1
AND
m.published = 1
GROUP BY
mr.message_id
ORDER BY
m.created DESC
更新 正如@e4c5 所建议的,我在 (published,user_id,created) 上添加了新的复合索引,现在解释查询显示了这一点:
如何通过添加所需的索引(如果有)来优化此查询,因为它需要很多时间?
【问题讨论】:
标签: mysql database join indexing query-optimization