Som du vet uppnår SQLServer detta med indexerade vyer :
I SQLServer, för att dra fördel av denna teknik, måste du fråga över vyn och inte över tabellerna. Det betyder att du bör känna till vyn och indexen.
MySQL har inga indexerade vyer, men du kan simulera beteendet med tabell + triggers + index .
Istället för att skapa en vy måste du skapa en indexerad tabell, en utlösare för att hålla datatabellen uppdaterad, och sedan måste du fråga din nya tabell istället för dina normaliserade tabeller.
Du måste utvärdera om overheaden för skrivoperationer uppväger förbättringen av läsoperationer.
Redigerad:
Observera att det inte alltid är nödvändigt att skapa en ny tabell. Till exempel, i en 1:N-relation (huvud-detalj)-utlösare, kan du behålla en kopia av ett fält från "master"-tabellen till "detalj"-tabellen. I ditt fall:
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;
Observera att detta är en trigger före infogning.
Nu skrivs frågan om enligt följande:
select * from tableOne t1
inner join tableTwo t2 on t1.tableTwoId = t2.id
where t1.objectId = '..'
order by t1.desnormalized_eventTime;
Ansvarsfriskrivning:ej testad.