Mysql
 sql >> Database >  >> RDS >> Mysql

Ottimizzazione dell'indicizzazione semplice

Come spiegato nel commento sopra, il INDEX(Dob) non viene utilizzato, poiché si tratta di un indice su anno-mese-giorno . Devi creare un indice su mese-giorno .

Probabilmente non è la soluzione più elegante, ma:

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

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

Per una risposta migliore (?):poiché MySQL non supporta le colonne calcolate, potresti aver bisogno di trigger per popolare le colonne "mese-giorno" e avere un indice su di essa:

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

Ciò consente inserimenti "semplici", preservando se necessario il Dob completo come nel tuo esempio originale:

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

Il SELECT la query deve essere modificata per utilizzare la nuova colonna "cerca":

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

Imposta http://sqlfiddle.com/#!2/66111/3