Blog Posts » MySQL » List of MySQL Slow-Queries

List of MySQL Slow-Queries

Berikut ini adalah daftar penggunaan query yang lambat pada MySQL yang telah saya temui. Sebenarnya sudah cukup banyak tetapi lupa hingga terjebak lagi dengan slow-query yang sama. Maka dari itu akan saya catat disini mulai dari awal, agar tidak ada lagi kesalahan yang ketiga :D

SELECT MAX() atau MIN() dengan WHERE
:
[Textarea][RAW][Download]

  1. SELECT MIN(timestamp) FROM table_name WHERE id = 1;


Query tsb saya tes pada 100 ribuan baris memakan waktu lebih dari satu detik. Jika tanpa pengkondisian WHERE id = 1, cuma 0.0002 detik. Jadi kesimpulannya jangan menaruh pengkondisian jika menggunakan SELECT MAX() atau MIN() pada data yang cukup besar.

Bagaimana jika ingin tetap menggunakan pengkodisian? Berikut ini adalah query pengganti SELECT MIN() diatas, meskipun tampak lebih panjang tetapi bisa jauh lebih cepat:
[Textarea][RAW][Download]

  1. SELECT timestamp FROM table_name WHERE id = 1 AND timestamp > 0 ORDER BY timestamp ASC LIMIT 1;


Queri tsb memakan waktu sekitar 0.0003 detik. Boleh menghilangkan "ORDER BY timestamp ASC" tetapi jika index-nya kacau (fragmentasi?) hasilnya bisa tidak valid.

Jika menggunakan SELECT MAX() maka penggantinya kira-kira seperti ini:
[Textarea][RAW][Download]

  1. SELECT timestamp FROM table_name WHERE id = 1 AND timestamp < 18446744073709551615 ORDER BY timestamp DESC LIMIT 1;


Kita taruh angka sembarang aja asal nilainya besar. Pada contoh tsb saya kasih angka 18446744073709551615 yaitu nilai maksimal BIGINT unsigned. Untuk yang ini wajib memakai "ORDER BY timestamp DESC", sebab kalau tidak hasilnya seperti SELECT MIN().

Bersambung... Capek nulisnya :P

Update:
Saya cek dengan:
[Textarea][RAW][Download]

  1. EXPLAIN SELECT MIN(timestamp) FROM table_name WHERE id = 1;


menunjukkan bahwa MySQL condong menggunakan index id.
Lalu saya coba paksa untuk menggunakan index timestamp ternyata kecepatannya menjadi 0.1241 detik (lebih cepat):
[Textarea][RAW][Download]

  1. SELECT MIN(timestamp) FROM table_name FORCE INDEX(timestamp) WHERE id = 1;

Tetapi masih lebih cepat query pengganti diatas.. :)

Lanjut Optimasi MySQL ORDER BY