优化慢速SQL查询

时间:2011-07-09 10:43:27

标签: php mysql query-optimization

我在更改SQL查询以更快地执行预测时遇到问题。我需要检索特定时间间隔的第一行和最后一行。例如,我正在寻找数据库中某个特定时间间隔(1小时,24小时)的第一个和最后一个日期。我有这个工作的sql语句,我正在使用php执行:

$query = "
    SELECT Date, RainABS
    FROM ws3600
    WHERE Date IN (
        (
            SELECT MIN(Date)
            FROM ws3600
            WHERE Date >= '" . $timeInterval1 . "'
                AND Date <= '" . $timeInterval2 . "'
        ),
        (
            SELECT MAX(Date)
            FROM ws3600
            WHERE Date >= '" . $timeInterval1 . "'
                AND Date <= '" . $timeInterval2 . "'
        )
    )
";

从查询中可以看出,表名是ws3600,我检索的参数是Date和RainABS。我正在使用IN运算符和两个内部选择语句。

问题是,在执行时:

$result = mysql_query($query);

这需要很长时间。我用这段代码测量了它:

$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;

$result = mysql_query($query);

$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$endtime = $mtime;
$totaltime = ($endtime - $starttime);

平均花费0.28秒。问题是我必须执行24个这样的判断,平均累积到6,72个。我知道我应该可以摆脱内在的selecet声明,但后来我不知道怎么能得到第一行和最后一行?

2 个答案:

答案 0 :(得分:4)

要使用MIN或MAX去除内部选择,答案通常是ORDER BY和LIMIT。

这样的事情:

SELECT Date, RainABS
FROM ws3600
WHERE Date >= '" . $timeInterval1 . "'
    AND Date <= '" . $timeInterval2 . "
ORDER BY Date ASC
LIMIT 1

UNION

SELECT Date, RainABS
FROM ws3600
WHERE Date >= '" . $timeInterval1 . "'
    AND Date <= '" . $timeInterval2 . "
ORDER BY Date DESC
LIMIT 1;

答案 1 :(得分:3)

这可以通过将查询数量减少一个来加快速度。

SELECT Date, RainABS
FROM ws3600
JOIN (
    SELECT
        MIN(Date) AS min,
        MAX(Date) AS max
    FROM ws3600
    WHERE Date >= '" . $timeInterval1 . "'
        AND Date <= '" . $timeInterval2 . "'
) AS x ON (ws3600.Date = min OR ws3600.Date = max);

编辑:回到大众需求......我在这里留下我的答案,因为它在技术上是正确的,但是,我相信最好的答案是使用两个UNION查询,如Szocske所建议。