Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Einfache Indizierungsoptimierung

Wie im obigen Kommentar erläutert, ist der INDEX(Dob) wird nicht verwendet -- da dies ein Index für Jahr-Monat-Tag ist . Sie müssen einen Index am Monat-Tag erstellen .

Wahrscheinlich nicht die eleganteste Lösung, aber:

CREATE TABLE `birthdayCard`(`Email` VARCHAR(255), `FirstName` CHAR(30), `LastName` CHAR(30),
                            `Mob` int, `Dob` int, 
                            PRIMARY KEY (Email), INDEX(`Mob`, `Dob`));

Siehe http://sqlfiddle.com/#!2/db82ff/1

Für eine bessere (?) Antwort:Da MySQL keine berechneten Spalten unterstützt, benötigen Sie möglicherweise Trigger, um eine "Monat-Tag"-Spalte zu füllen und einen Index darauf zu haben:

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");

Dies ermöglicht "einfache" Einfügungen, wobei bei Bedarf der vollständige Dob erhalten bleibt wie in Ihrem ursprünglichen Beispiel:

insert into birthdayCard (Email, FirstName, LastNAme, Dob) 
   values ("[email protected]", "Sylvain", "Leroux", '2013-08-05');

Die SELECT Die Abfrage muss geändert werden, um die neue Spalte "Suche" zu verwenden:

SELECT * FROM `birthdayCard` WHERE Birthday = DATE_FORMAT(NOW(), "%m%d");

Setzen Sie http://sqlfiddle.com/#!2/66111/3