Saya akan menulis kueri seperti ini:
SELECT c.time
, SUM(c.counter)
, MAX(p.clustername) AS clustername
FROM cell c
JOIN swap_plan p
ON p.siteid = c.siteid
AND p.clustername = 'Cluster A'
WHERE c.time >= 'day1'
AND c.time <= 'day2'
GROUP
BY c.time
Saya pasti akan memiliki indeks di cell
dengan time
sebagai kolom terdepan.
MySQL dapat menggunakan indeks yang sama untuk memenuhi predikat rentang (dalam klausa WHERE), dan untuk memenuhi GROUP BY tanpa operasi "Menggunakan filesort".
... ON cell (time)
Tergantung pada ukuran kolom, indeks penutup mungkin memberikan kinerja yang optimal. Indeks penutup mencakup semua kolom dari tabel yang direferensikan dalam kueri, sehingga kueri dapat dipenuhi sepenuhnya dari halaman indeks tanpa mencari halaman di tabel yang mendasarinya.
... ON cell (time, siteid, counter)
Untuk indeks di swap_plan
, saya akan memiliki indeks dengan site_id
sebagai kolom utama, dan menyertakan clustername
kolom, salah satu dari:
... ON swap_plan (clustername, site_id)
atau
... ON swap_plan (site_id, clustername)
Sepertinya akan ada batasan UNIK pada kombinasi kedua kolom tersebut, yaitu nilai site_id
akan berbeda untuk clustername
yang diberikan . (Jika bukan itu masalahnya, dan (site_id,clustername)
yang sama tuple muncul beberapa kali, ada potensi agregat total counter
untuk digelembungkan.
Saya akan mencari EXPLAIN
output untuk menampilkan pencarian 'ref' ke swap_plan
tabel dari nilai c.siteid
dan nilai const (literal 'Cluster A') untuk nama cluster.
Dengan tabel berukuran 31 baris dan 368 baris, kita tidak akan melihat perbedaan kinerja yang signifikan (waktu berlalu) antara rencana eksekusi yang optimal dan rencana eksekusi yang buruk.
Ketika salah satu tabel menskalakan hingga jutaan baris, saat itulah perbedaannya akan terlihat. Pilihan pengoptimal dari rencana eksekusi dipengaruhi oleh statistik (ukuran, jumlah baris, kardinalitas kolom) dari setiap tabel, sehingga rencana eksekusi dapat berubah dengan peningkatan ukuran tabel.