Tach!
Wenn eine Klause auf Monat und Jahr liegt, muss schonmal gar nicht die ganze Tabelle durchlaufen werden: Genau da greift nämlich der Index -- Falls vorhanden.
Kann ich nicht nachvollziehen. Ich hab eine Testdatenbank genommen. Ein Index auf employees.birth_date war nicht vorhanden, den habe ich vor dem Test hinzugefügt. Das Ergebnis sagt, dass kein nutzbarer Key für die Query mit YEAR() verwendet werden konnte (MONTH() hab ich mir gespart). Beim BETWEEN hingegen konnte der Index jedoch verwendet werden.
EXPLAIN SELECT * FROM `employees` WHERE YEAR(`birth_date`)=1960
id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra 1|SIMPLE|employees|ALL|NULL|NULL|NULL|NULL|299348|Using where
EXPLAIN SELECT * FROM `employees` WHERE `birth_date` BETWEEN '1960-01-01' AND '1960-12-31'
id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra 1|SIMPLE|employees|range|birth_date|birth_date|3|NULL|47684|Using index condition
dedlfix.