sql >> Database >  >> RDS >> Mysql

Eenvoudige indexeringsoptimalisatie

Zoals uitgelegd in de opmerking hierboven, is de INDEX(Dob) wordt niet gebruikt -- aangezien dit een index is op jaar-maand-dag . U moet een index maken op maand-dag .

Waarschijnlijk niet de meest elegante oplossing, maar:

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

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

Voor een beter (?) antwoord:aangezien MySQL geen berekende kolommen ondersteunt, hebt u mogelijk triggers nodig om een ​​"maand-dag"-kolom te vullen en er een index op te hebben:

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

Dit maakt "eenvoudige" invoegingen mogelijk, waarbij indien nodig de volledige Dob . behouden blijft zoals in je originele voorbeeld:

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

De SELECT zoekopdracht moet worden aangepast om de nieuwe kolom "zoeken" te gebruiken:

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

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



  1. sfinx zoeken naar gedeeltelijke trefwoordovereenkomsten

  2. PHP:vind ik leuk/niet leuk teller

  3. gegevens uit database weergeven in vervolgkeuzelijst CodeIgniter

  4. Array bijwerken in PostgreSQL