我有以下查询(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}
但是,如果我将N个查询中的查询与UNION分开,则只需要大约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";
}
?>
关于如何在不执行UNIONS的情况下提高速度的任何想法?
编辑(添加结构):
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
答案 0 :(得分:2)
请尝试使用此查询:
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
这个应该快得多的原因是,每个id,max(day)存储在内存中(如果太大则存储在磁盘上的临时表),然后连接到表X.在查询中,表X的行和您查询表all_days的每一行。
答案 1 :(得分:0)
在这种简单的情况下(假设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.b