Come spiegato nel commento sopra, il INDEX(Dob)
non viene utilizzato, poiché si tratta di un indice su anno-mese-giorno . Devi creare un indice su mese-giorno .
Probabilmente non è la soluzione più elegante, ma:
CREATE TABLE `birthdayCard`(`Email` VARCHAR(255), `FirstName` CHAR(30), `LastName` CHAR(30),
`Mob` int, `Dob` int,
PRIMARY KEY (Email), INDEX(`Mob`, `Dob`));
Vedi http://sqlfiddle.com/#!2/db82ff/1
Per una risposta migliore (?):poiché MySQL non supporta le colonne calcolate, potresti aver bisogno di trigger per popolare le colonne "mese-giorno" e avere un indice su di essa:
CREATE TABLE `birthdayCard`(`Email` VARCHAR(255), `FirstName` CHAR(30), `LastName` CHAR(30),
`Dob` DATE,
`Birthday` CHAR(5),
PRIMARY KEY (Email), INDEX(`Birthday`));
CREATE TRIGGER ins_bithdayCard BEFORE INSERT ON `birthdayCard`
FOR EACH ROW
SET NEW.`birthday` = DATE_FORMAT(NEW.`Dob`, "%m%d");
CREATE TRIGGER upd_bithdayCard BEFORE UPDATE ON `birthdayCard`
FOR EACH ROW
SET NEW.`birthday` = DATE_FORMAT(NEW.`Dob`, "%m%d");
Ciò consente inserimenti "semplici", preservando se necessario il Dob
completo come nel tuo esempio originale:
insert into birthdayCard (Email, FirstName, LastNAme, Dob)
values ("[email protected]", "Sylvain", "Leroux", '2013-08-05');
Il SELECT
la query deve essere modificata per utilizzare la nuova colonna "cerca":
SELECT * FROM `birthdayCard` WHERE Birthday = DATE_FORMAT(NOW(), "%m%d");
Imposta http://sqlfiddle.com/#!2/66111/3