两个表之间的SQL查询效率

时间:2014-07-02 06:59:39

标签: php mysql sql

我有以下查询(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

2 个答案:

答案 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