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

Je možné indexování napříč tabulkami?

Jak víte, SQLServer toho dosahuje pomocí indexovaných zobrazení :

V SQLServer, chcete-li využít tuto techniku, musíte dotazovat přes zobrazení a ne přes tabulky. To znamená, že byste měli vědět o zobrazení a indexech.

MySQL nemá indexovaná zobrazení, ale můžete simulovat chování pomocí tabulky + spouštěčů + indexů .

Namísto vytváření pohledu musíte vytvořit indexovanou tabulku, spouštěč, aby byla tabulka dat aktuální, a poté musíte místo normalizovaných tabulek dotazovat novou tabulku.

Musíte vyhodnotit, zda režie operací zápisu kompenzuje zlepšení operací čtení.

Upraveno:

Všimněte si, že není vždy nutné vytvářet novou tabulku. Například ve spouštěči vztahu 1:N (master-detail) si můžete ponechat kopii pole z „hlavní“ tabulky do tabulky „detail“. Ve vašem případě:

CREATE TABLE tableOne (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    tableTwoId INT UNSIGNED NOT NULL,
    objectId INT UNSIGNED NOT NULL,
    desnormalized_eventTime DATETIME NOT NULL,
    INDEX (objectID),
    FOREIGN KEY (tableTwoId) REFERENCES tableTwo (id)
) ENGINE=InnoDB;

CREATE TRIGGER tableOne_desnormalized_eventTime
   BEFORE INSERT ON tableOne
for each row
begin
  DECLARE eventTime DATETIME;
  SET eventTime = 
      (select eventTime 
       from tableOne
       where tableOne.id = NEW.tableTwoId);
  NEW.desnormalized_eventTime = eventTime;
end;

Všimněte si, že se jedná o spouštěč před vložením.

Nyní je dotaz přepsán následovně:

select * from tableOne t1 
  inner join tableTwo t2 on t1.tableTwoId = t2.id
  where t1.objectId = '..'
  order by t1.desnormalized_eventTime;

Prohlášení:netestováno.



  1. PROBLÉM:Mysql převádí Enum na Int

  2. Automatické zvýšení klíče SQLite PRIMARY nefunguje

  3. Získejte zřetelný součet spojeného sloupce tabulky

  4. mysql:select max(score) nevrací relevantní data řádku