जैसा कि ऊपर टिप्पणी में बताया गया है, 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