Như đã giải thích trong nhận xét ở trên, INDEX(Dob)
không được sử dụng - vì đây là chỉ mục trên năm-tháng-ngày . Bạn phải tạo chỉ mục vào tháng-ngày .
Có lẽ không phải là giải pháp thanh lịch nhất, nhưng:
CREATE TABLE `birthdayCard`(`Email` VARCHAR(255), `FirstName` CHAR(30), `LastName` CHAR(30),
`Mob` int, `Dob` int,
PRIMARY KEY (Email), INDEX(`Mob`, `Dob`));
Xem http://sqlfiddle.com/#!2/db82ff/1
Để có câu trả lời tốt hơn (?):Vì MySQL không hỗ trợ các cột được tính toán, bạn có thể cần trình kích hoạt để điền các cột "tháng-ngày" và có một chỉ mục trên đó:
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");
Điều này cho phép chèn "đơn giản", bảo toàn Dob
đầy đủ nếu cần như trong ví dụ ban đầu của bạn:
insert into birthdayCard (Email, FirstName, LastNAme, Dob)
values ("[email protected]", "Sylvain", "Leroux", '2013-08-05');
SELECT
truy vấn phải được sửa đổi để sử dụng cột "tìm kiếm" mới:
SELECT * FROM `birthdayCard` WHERE Birthday = DATE_FORMAT(NOW(), "%m%d");
Sett http://sqlfiddle.com/#!2/66111/3