SQL: prestasi buruk walaupun terdapat indeks

Saya baru saja berhadapan dengan masalah prestasi berikut dari pangkalan data SQL: Dalam jadual SQL yang disebut "pengguna" dengan ~ 1,000,000 entri, diperlukan 28 saat yang tidak dapat diterima untuk menentukan jumlah pendaftaran hari ini. 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.

Belakang