Mysql
 sql >> Base de données >  >> RDS >> Mysql

Optimisation de l'indexation simple

Comme expliqué dans le commentaire ci-dessus, le INDEX(Dob) n'est pas utilisé -- puisqu'il s'agit d'un index sur année-mois-jour . Vous devez créer un index sur mois-jour .

Ce n'est probablement pas la solution la plus élégante, mais :

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

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

Pour une meilleure réponse ( ?) :étant donné que MySQL ne prend pas en charge les colonnes calculées, vous aurez peut-être besoin de déclencheurs pour remplir une colonne "mois-jour" et avoir un index dessus :

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

Cela permet des insertions "simples", en préservant si besoin le Dob complet comme dans votre exemple d'origine :

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

Le SELECT la requête doit être modifiée pour utiliser la nouvelle colonne "recherche" :

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

Définir http://sqlfiddle.com/#!2/66111/3