27 February 2012

Agar kolom datetime di mysql indexnya termanfaatkan

Tulisan self reminder,

Ternyata kolom datetime di mysql, bila di proses dengan function date_format, tidak akan memanfaatkan index dari kolom tersebut, selain itu, filtering tanggal via conditional HAVING saat grouping juga tidak memanfaatkan sama sekali si index, membuat proses menjadi lama, karena si mysql akan menggunakan full table scan

Kasus ini terjadi karena saya membutuhkan filtering tanggal saja dari kolom datetime tersebut sehingga saya format saat query bagian grouping menjadi

date_format(kolomtanggalwaktu, '%Y-%m-%d') = '2012-02-27'  

Saat awal programming, hal ini tidak terpantau karena masih sedikitnya data, tapi saat saya menggunakan data klien yang sudah ratusan ribu baris, barulah terasa, menohok sekali tendangan pengabaian index ini... *tssah*

Akhirnya setelah di tuning, barulah index tergunakan bila saya menggunakan query conditional seperti ini :

WHERE kolomtanggalwaktu BETWEEN '2012-02-27 00:00:00' AND '2012-02-27 23:59:59'

Note, si conditional waktu ini harus ada dalam filtering WHERE karena dia tetap tidak berpengaruh saat ada dalam filtering HAVING bila kita menggunakan grouping.

Situasi yang lumayan merubah banyak query inih...

Btw, untuk yang belum tahu, bagaimana saya tahu index itu digunakan atau tidak? dengan menggunakan sintax EXPLAIN, pasang saja di depan sintax query misal

EXPLAIN SELECT * FROM TABLE WHERE dst...