Untuk mendapatkan entri di bulan tertentu, untuk tahun tertentu, lebih cepat - Anda akan perlu mengindeks time
kolom
:
CREATE INDEX idx_time ON ENTRIES(time) USING BTREE;
Selain itu, gunakan:
SELECT e.*
FROM ENTRIES e
WHERE e.time BETWEEN '2010-04-01' AND DATE_SUB('2010-05-01' INTERVAL 1 SECOND)
...karena BETWEEN bersifat inklusif, jadi Anda akan mendapatkan apa pun tertanggal "2010-05-01 00:00:00" dengan kueri yang Anda poskan.
Saya juga ingin memilih data dari bulan tertentu dari DataSourceID tertentu
Anda dapat menambahkan indeks terpisah untuk kolom datasourceid:
CREATE INDEX idx_time ON ENTRIES(datasourceid) USING BTREE;
...atau siapkan indeks penutup untuk menyertakan kedua kolom:
CREATE INDEX idx_time ON ENTRIES(time, datasourceid) USING BTREE;
Indeks penutup mengharuskan kolom paling kiri harus digunakan dalam kueri agar indeks dapat digunakan. Dalam contoh ini, memiliki time
pertama akan berfungsi untuk kedua situasi yang Anda sebutkan -- datasourceid tidak harus digunakan agar indeks dapat digunakan. Namun, Anda harus menguji kueri Anda dengan melihat keluaran EXPLAIN untuk benar-benar mengetahui apa yang terbaik untuk data Anda &kueri yang dilakukan pada data tersebut.
Yang mengatakan, indeks akan memperlambat pernyataan INSERT, UPDATE dan DELETE. Dan indeks tidak memberikan banyak nilai jika data kolom memiliki sedikit nilai yang berbeda - IE:kolom boolean adalah pilihan yang buruk untuk diindeks, karena kardinalitasnya rendah.