如果我的查询如下:
SELECT *
FROM member
LEFT JOIN group ON (member.group_id = group.id)
WHERE group.created > @date
ORDER BY member.last_updated
如果我为:
创建两个索引member.group_id, member.last_updated
group.id, group.created
这是优化原始查询的最佳方法吗?我应该添加一个新的字段member.group_created
和索引,如下所示:
member.group_created, member.last_updated
答案 0 :(得分:1)
SELECT *
FROM member AS m
LEFT JOIN group AS g ON (m.group_id = g.id)
WHERE g.created > @date
ORDER BY m.last_updated
*
)两个表格的列,请不要提出要求;它可能会影响性能。LEFT
吗?也就是说,对于'右边'中缺少的任何行,您是否希望NULL
表?member
开头,则 可能会从INDEX(last_updated)
中受益。假设id
是PRIMARY KEY of
组`,那里不需要额外的索引。group
开头,则INDEX(created)
可能有用。然后,m
需要INDEX(group_id)
。所以,如果它们不存在,请添加我建议的3个索引。
如果您遇到更多问题,请提供SHOW CREATE TABLE
和EXPLAIN SELECT ...
答案 1 :(得分:0)
不要在左连接表中使用where子句,而是执行类似的操作。
SELECT * FROM成员
LEFT JOIN组ON(member.group_id = group.id和group.created> @date)
ORDER BY member.last_updated
还在组表
中添加索引(id,created)