Zoals u weet, bereikt SQLServer dit met geïndexeerde weergaven :
Om in SQLServer van deze techniek te profiteren, moet u query's uitvoeren op de view en niet op de tabellen. Dat betekent dat u op de hoogte moet zijn van de weergave en indexen.
MySQL heeft geen geïndexeerde weergaven, maar u kunt het gedrag simuleren met tabel + triggers + indexen .
In plaats van een weergave te maken, moet u een geïndexeerde tabel maken, een trigger om de gegevenstabel up-to-date te houden, en vervolgens moet u uw nieuwe tabel opvragen in plaats van uw genormaliseerde tabellen.
U moet evalueren of de overhead van schrijfbewerkingen de verbetering van leesbewerkingen compenseert.
Bewerkt:
Merk op dat het niet altijd nodig is om een nieuwe tabel aan te maken. In een trigger voor een 1:N-relatie (hoofd-detail) kunt u bijvoorbeeld een kopie van een veld uit de 'hoofd'-tabel in de 'detail'-tabel bewaren. In jouw geval:
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;
Merk op dat dit een trigger is voor het invoegen.
Nu wordt de query als volgt herschreven:
select * from tableOne t1
inner join tableTwo t2 on t1.tableTwoId = t2.id
where t1.objectId = '..'
order by t1.desnormalized_eventTime;
Disclaimer:niet getest.