sql >> Databáze >  >> RDS >> Mysql

Jednoduchá optimalizace indexování

Jak je vysvětleno v komentáři výše, INDEX(Dob) se nepoužívá -- protože se jedná o index rok-měsíc-den . Index musíte vytvořit měsíc-den .

Asi to není nejelegantnější řešení, ale:

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

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

Pro lepší ( ?) odpověď:protože MySQL nepodporuje počítané sloupce, možná budete potřebovat spouštěče k naplnění sloupců „měsíc-den“ a mít na nich index:

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

To umožňuje "jednoduché" vkládání, v případě potřeby zachování plného Dob jako ve vašem původním příkladu:

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

SELECT dotaz musí být upraven tak, aby používal nový sloupec "hledání":

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

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



  1. Jak získám první den v týdnu data v mysql?

  2. Primární klíč automatického přírůstku MySQL se zvýší o 10

  3. Psaní dotazu pro více tabulek v php

  4. jak spojit dva sloupce do jednoho se stávajícím názvem sloupce v mysql?