1 億レコードを含むデータベース テーブルがあります。実行に 20 分かかるクエリがあります。どうすればクエリを簡単かつ迅速に実行できますか?
SELECT newnum,
Sum(Ceil(seconds / 60)) AS ttime
FROM astb
GROUP BY newnum
ORDER BY ttime DESC
LIMIT 100;
これは優れたデータベース設計ではceil(seconds/60)
ありませんが、保持する列を追加して、常に再計算する必要がないようにすることはできますか?
ORDER BY
LIMIT
インデックスで最適に機能します。したがって、可能であれば、列にインデックスを付けることができますnewnum
。
もう 1 つのポイントは、巨大なテーブル内のすべてのレコードを計算していることです。これらのレコードで計算を行うよりも、最初に一時テーブルのレコードを選択することを強くお勧めします。
EDIT UPDATED SCRIPT: 次のように一時テーブルを使用できます。
CREATE TEMPORARY TABLE temp AS
(SELECT newnum, SUM(seconds) AS ttime
FROM astb GROUP BY newnum)
SELECT newnum, CEIL(ttime / 60) AS ttime
FROM temp
ORDER BY ttime DESC
LIMIT 100;
DROP TABLE temp;