正如上面评论中所解释的,INDEX(Dob)
没有使用 - 因为这是year-month-day的索引。您必须在month-day创建索引。
可能不是最优雅的解决方案,但是:
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 ("x@y.com", "Sylvain", "Leroux", '2013-08-05');
SELECT
必须修改查询以使用新的“搜索”列:
SELECT * FROM `birthdayCard` WHERE Birthday = DATE_FORMAT(NOW(), "%m%d");
设置http://sqlfiddle.com/#!2/66111/3