Saya baru saja berhadapan dengan masalah prestasi berikut dari pangkalan data SQL: Dalam jadual SQL yang disebut "pengguna" dengan ~ 1,000,000 entri, penentuan jumlah pendaftaran hari ini mengambil masa 28 saat yang tidak dapat diterima. Waktu pendaftaran disimpan dalam format "Ymd H: i: s" dalam lajur "dibuat".
Pertanyaan yang digunakan
SELECT COUNT(ID) FROM users WHERE DATE(created) = '2014-12-21';
menyebabkan masa memuatkan ini, walaupun sudah ada indeks dalam lajur "dibuat" dalam format DATETIME
ALTER TABLE `users` ADD INDEX `created` (`created`);
telah ditetapkan. Sebab prestasi buruk adalah panggilan fungsi DATE: Lajur terindeks "dibuat" dihantar oleh fungsi DATE dan menjadikan indeks tidak berkesan. Query Optimizer hanya mengetahui "dibuat", tetapi bukan hasil DATE (dibuat). Pertanyaan yang dioptimumkan
SELECT COUNT(ID) FROM users WHERE created BETWEEN '2014-12-21' AND '2014-12-21 23:59:59';
membawa kepada hasil yang diinginkan dalam masa 0.4 saat.