クエリで2つの列を要求しているだけなので、インデックスはそこに移動できます/移動する必要があります:
- DateTime
- LoadTime
クエリを高速化するもう1つの方法は、DateTimeフィールドを日付と時刻の2つに分割することです。
このようにして、dbはDATE(...)を計算する代わりに日付フィールドに直接グループ化できます。
編集済み:
トリガーを使用する場合は、新しい列(DATE)を作成し、 newdateと呼びます。 、これを試してみてください(正しいかどうかを確認するために今は試すことができません):
CREATE TRIGGER upd_check BEFORE INSERT ON SpeedMonitor
FOR EACH ROW
BEGIN
SET NEW.newdate=DATE(NEW.DateTime);
END
再度編集:
約900,000レコードで満たされた同じテーブルspeedmonitorを使用してdbを作成しました。
次に、クエリS ELECT newdate、AVG(LoadTime)loadtime FROM speedmonitor GROUP BY newdate コード> 約100秒かかりました!!
newdateフィールドのインデックスを削除します(そして RESET QUERY CACHE
を使用してキャッシュをクリアします およびFLUSHTABLES
)、同じクエリに0.6秒かかりました!!!
比較のために:クエリ SELECT DATE(DateTime)、AVG(LoadTime)loadtime FROM speedmonitor GROUP BY DATE(DateTime)
0.9秒かかりました。
したがって、newdateのインデックスは適切ではないと思います。削除してください。
できるだけ多くのレコードを追加して、2つのクエリを再度テストします。
最終編集:
newdate列とDateTime列のインデックスを削除し、8mlnレコードを使用します スピードモニターテーブルの結果は次のとおりです:
- newdate列の選択とグループ化: 7.5s
- DATE(DateTime)フィールドでの選択とグループ化: 13.7s
良いスピードアップだと思います。
mysqlコマンドプロンプト内でクエリを実行するのに時間がかかります。