SQL: κακή απόδοση παρά το ευρετήριο

Ήμουν αντιμέτωπος με το ακόλουθο πρόβλημα απόδοσης μιας βάσης δεδομένων SQL: Σε έναν πίνακα SQL που ονομάζεται "χρήστες" με ~ 1.000.000 καταχωρήσεις, ο προσδιορισμός του αριθμού των εγγραφών σήμερα διήρκεσε απαράδεκτα 28 δευτερόλεπτα. Οι ώρες των εγγραφών αποθηκεύτηκαν στη μορφή "Ymd H: i: s" στη στήλη "δημιουργήθηκε".


Το ερώτημα που χρησιμοποιήθηκε

SELECT COUNT(ID) FROM users WHERE DATE(created) = '2014-12-21';

οδήγησε σε αυτόν τον χρόνο φόρτωσης, αν και υπήρχε ήδη ένα ευρετήριο στη στήλη "δημιουργήθηκε" της μορφής DATETIME

ALTER TABLE `users` ADD INDEX `created` (`created`);

είχε οριστεί. Ο λόγος για την κακή απόδοση είναι η κλήση συνάρτησης της DATE: Η στήλη ευρετηρίου "δημιουργήθηκε" αποστέλλεται από τη συνάρτηση DATE και καθιστά το ευρετήριο αναποτελεσματικό. Το Query Optimizer γνωρίζει μόνο "δημιουργήθηκε", αλλά όχι το αποτέλεσμα της DATE (δημιουργήθηκε). Το βελτιστοποιημένο ερώτημα

SELECT COUNT(ID) FROM users WHERE created BETWEEN '2014-12-21' AND '2014-12-21 23:59:59';

οδηγεί στο επιθυμητό αποτέλεσμα σε χρόνο 0,4 δευτερολέπτων.

Πίσω