对JOIN和WHERE子句建立索引

时间:2017-05-13 05:09:25

标签: mysql join indexing

如果我的查询如下:

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

2 个答案:

答案 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)中受益。假设idPRIMARY KEY of组`,那里不需要额外的索引。
  • 如果它决定以group开头,则INDEX(created) 可能有用。然后,m需要INDEX(group_id)

所以,如果它们不存在,请添加我建议的3个索引。

如果您遇到更多问题,请提供SHOW CREATE TABLEEXPLAIN SELECT ...

答案 1 :(得分:0)

不要在左连接表中使用where子句,而是执行类似的操作。

SELECT * FROM成员

LEFT JOIN组ON(member.group_id = group.id和group.created> @date)

ORDER BY member.last_updated

还在组表

中添加索引(id,created)