【发布时间】:2016-08-08 14:25:34
【问题描述】:
我有两个具有一对多关系的表。
Table1
ID name email
Table2
ID table1_ID date
我需要从 Table1 where 获取所有数据:
MAX(date) from Table2 < "2016-01-01"
这不起作用。 Max 在 where 子句中被视为“无效”。我所做的是:
SELECT Table1.name, Table1.email, tmp.maxdate
FROM Table1
JOIN ( SELECT MAX(date) maxdate, table1_ID
FROM Table2
GROUP BY table1_ID ) as tmp
ON tmp.table1_ID = table1.id
WHERE tmp.maxdate < "2016-01-01"
AND (other conditions)
所以这行得通。但是我认为性能会很糟糕——explain 表明所有的Table2 都在被读取,并且这个表会增长很多。
知道我该怎么做,或者如何提高我当前的查询性能?
【问题讨论】:
-
为什么你认为性能很糟糕?
-
将 tmp 加入 table1 有点奇怪,而不是将 tmp 加入表 2 的中间步骤。另外,我将 WHERE 子句放在子查询中。除此之外,经过适当索引,此查询应该非常快。
-
由于
MAX(date)是一个聚合,它不能放在WHERE中,而是属于HAVING。无论如何,正如其他人指出的那样,您可以简单地使用WHERE date > '2016-01-01'而不是HAVING MAX(date) > '2016-01-01'。 -
@Strawberry 好吧,要将 tmp 加入到 Table2 我还必须将 Table2 加入到查询中,这不是一个无用的连接,因为除了已经来自的表之外,我没有使用该表时间?另外,很好的一点是,将
where date > X添加到子查询中会对性能有所帮助。 -
如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 CREATE 和 INSERT 语句(和/或 sqlfiddle),以便我们可以更容易复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
标签: mysql sql database query-optimization