Както е обяснено в коментара по-горе, INDEX(Dob)
не се използва -- тъй като това е индекс на година-месец-ден . Трябва да създадете индекс на месец-ден .
Вероятно не е най-елегантното решение, но:
CREATE TABLE `birthdayCard`(`Email` VARCHAR(255), `FirstName` CHAR(30), `LastName` CHAR(30),
`Mob` int, `Dob` int,
PRIMARY KEY (Email), INDEX(`Mob`, `Dob`));
Вижте http://sqlfiddle.com/#!2/db82ff/1
За по-добър (?) отговор:тъй като MySQL не поддържа изчислени колони, може да имате нужда от тригери за попълване на колони „месец-ден“ и да имате индекс върху тях:
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");
Това позволява "прости" вмъквания, запазвайки, ако е необходимо, пълния Dob
както във вашия оригинален пример:
insert into birthdayCard (Email, FirstName, LastNAme, Dob)
values ("[email protected]", "Sylvain", "Leroux", '2013-08-05');
SELECT
заявката трябва да бъде променена, за да използва новата колона "търсене":
SELECT * FROM `birthdayCard` WHERE Birthday = DATE_FORMAT(NOW(), "%m%d");
Задайте http://sqlfiddle.com/#!2/66111/3