Anda hanya meminta dua kolom dalam kueri Anda, jadi indeks bisa/harus masuk ke sana:
- TanggalWaktu
- Waktu Muat
Cara lain untuk mempercepat kueri Anda dapat membagi bidang DateTime menjadi dua:tanggal dan waktu.
Dengan cara ini db dapat mengelompokkan secara langsung pada bidang tanggal alih-alih menghitung DATE(...).
DIEDIT:
Jika Anda lebih suka menggunakan pemicu, buat kolom baru(DATE) dan beri nama tanggal baru , dan coba dengan ini (saya tidak bisa mencobanya sekarang untuk melihat apakah itu benar):
CREATE TRIGGER upd_check BEFORE INSERT ON SpeedMonitor
FOR EACH ROW
BEGIN
SET NEW.newdate=DATE(NEW.DateTime);
END
DIEDIT LAGI:
Saya baru saja membuat db dengan tabel speedmonitor yang sama yang diisi dengan sekitar 900.000 record.
Kemudian saya menjalankan query SELECT newdate,AVG(LoadTime) loadtime FROM speedmonitor GROUP BY newdate
dan butuh waktu sekitar 100 detik!!
Menghapus indeks pada bidang tanggal baru (dan membersihkan cache menggunakan RESET QUERY CACHE
dan FLUSH TABLES
), kueri yang sama membutuhkan waktu 0,6 detik!!!
Hanya untuk perbandingan:kueri SELECT DATE(DateTime),AVG(LoadTime) loadtime FROM speedmonitor GROUP BY DATE(DateTime)
membutuhkan waktu 0,9 detik.
Jadi menurut saya indeks pada tanggal baru tidak baik:hapus saja.
Saya akan menambahkan catatan sebanyak mungkin sekarang dan menguji dua kueri lagi.
EDIT AKHIR:
Menghapus indeks pada kolom tanggal baru dan DateTime, yang memiliki 8 juta catatan pada tabel speedmonitor, berikut adalah hasilnya:
- memilih dan mengelompokkan pada kolom tanggal baru:7,5 detik
- memilih dan mengelompokkan pada bidang DATE(DateTime):13,7 detik
Saya rasa ini adalah kecepatan yang bagus.
Waktu yang dibutuhkan untuk mengeksekusi query di dalam command prompt mysql.