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

Simpel indekseringsoptimering

Som forklaret i kommentaren ovenfor er INDEX(Dob) bruges ikke -- da dette er et indeks på år-måned-dag . Du skal oprette et indeks på måned-dag .

Nok ikke den mest elegante løsning, 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

For et bedre( ?) svar:da MySQL ikke understøtter beregnede kolonner, har du muligvis brug for triggere til at udfylde en "måned-dag"-kolonner og have et indeks 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");

Dette tillader "simple" indsættelser og bevarer om nødvendigt hele Dob som i dit originale eksempel:

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

SELECT forespørgslen skal ændres for at bruge den nye "søge"-kolonne:

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

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



  1. Hvordan grupperer du efter et tidsbaseret interval?

  2. Udskriv dataene i ResultSet sammen med kolonnenavne

  3. Konfigurer en `DataSource` til at oprette forbindelse til en administreret Postgres-server på Digital Ocean med SSL/TLS-kryptering

  4. Mysql-funktion, der returnerer en værdi fra en forespørgsel