sql >> Databasteknik >  >> RDS >> Mysql

Enkel indexeringsoptimering

Som förklarats i kommentaren ovan, INDEX(Dob) används inte -- eftersom detta är ett index på år-månad-dag . Du måste skapa ett index på månadsdag .

Förmodligen inte den mest eleganta lösningen, men:

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

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

För ett bättre( ?) svar:eftersom MySQL inte stöder beräknade kolumner, kan du behöva utlösare för att fylla i en "månad-dag"-kolumner och ha ett index på den:

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

Detta tillåter "enkla" infogningar och bevarar vid behov hela Dob som i ditt ursprungliga exempel:

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

SELECT frågan måste ändras för att använda den nya "sök"-kolumnen:

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

Ställ in http://sqlfiddle.com/#!2/66111/3



  1. Hur uppdaterar jag två tabeller med en enda JOIN-sats i MYSQL-servern?

  2. Att lägga till värdena för 2 textrutor för att visa resulterar i en av dem

  3. Hur lägger man till datum och tidsstämpel till en INSERT via PHP med mySQL?

  4. SQL växla från avkodning till fall