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.