下面的查询(MySQL)非常慢(大约15秒)。我已经更改了列和表的名称,很抱歉,如果它有任何类型错误;原始查询正在工作,只保留概念,而不是文字查询。
SELECT
id,
b,
(SELECT MAX( day )
FROM all_days
WHERE all_days.id = X.id
) AS day
FROM X请注意,all_days有超过200万行。我有3个索引:一个用于id,另一个用于当天,另一个用于{id,day}
但是,如果我用UNION在N个查询中分隔查询,则使用相同的结果只需1秒或更短时间:
<?php
$ids = getIds(); // get all ID from X with a query
$i = 0
foreach ($ids as $id) {
if ($i++ > 0) {
$query .= " UNION ";
}
$query .= "SELECT MAX( day )
FROM all_days
WHERE all_days.id = $id";
}
?>我怎么能在没有工会的情况下提高速度呢?
编辑(添加结构):
Table X:
id INTEGER PRIMARY KEY
b INTEGER -- extra info
Table all_days:
day_id INTEGER PRIMARY KEY
id INTEGER FK X.id
day DATETIME
all_days indexes:
id
day
id,day发布于 2014-07-02 07:06:52
请尝试使用以下查询:
SELECT
id,
b,
max_day
FROM X
INNER JOIN
(
SELECT id, MAX(`day`) AS max_day
FROM all_days
GROUP BY id
) AS max_days
ON max_days.id = X.id这应该更快的原因是,这里的最大值(Day)存储在内存中(或者磁盘上的临时表(如果太大),然后连接到表X。在查询中,您读取表X的每一行和查询表all_days的每一行。
发布于 2014-07-02 10:54:40
在这样一个简单的情况下(假设X.id / X.b的组合是唯一的),那么这可以不需要子查询就可以完成:-
SELECT X.id,
X.b,
MAX( all_days.day ) AS day
FROM X
LEFT OUTER JOIN all_days
ON all_days.id = X.id
GROUP BY X.id, X.bhttps://stackoverflow.com/questions/24524751
复制相似问题