Wie Sie wissen, erreicht SQLServer dies mit indizierten Ansichten :
Um diese Technik in SQL Server nutzen zu können, müssen Sie die Ansicht und nicht die Tabellen abfragen. Das bedeutet, dass Sie über View und Indizes Bescheid wissen sollten.
MySQL hat keine indizierten Ansichten, aber Sie können das Verhalten mit Tabelle + Triggern + Indizes simulieren .
Anstatt eine Ansicht zu erstellen, müssen Sie eine indizierte Tabelle erstellen, einen Trigger, um die Datentabelle auf dem neuesten Stand zu halten, und dann müssen Sie Ihre neue Tabelle anstelle Ihrer normalisierten Tabellen abfragen.
Sie müssen prüfen, ob der Overhead von Schreibvorgängen die Verbesserung von Lesevorgängen ausgleicht.
Bearbeitet:
Beachten Sie, dass es nicht immer notwendig ist, eine neue Tabelle zu erstellen. Beispielsweise können Sie in einem Auslöser für eine 1:N-Beziehung (Master-Detail) eine Kopie eines Felds aus der „Master“-Tabelle in der „Detail“-Tabelle behalten. In Ihrem 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;
Beachten Sie, dass dies ein Before-Insert-Trigger ist.
Nun wird die Abfrage wie folgt umgeschrieben:
select * from tableOne t1
inner join tableTwo t2 on t1.tableTwoId = t2.id
where t1.objectId = '..'
order by t1.desnormalized_eventTime;
Haftungsausschluss:nicht getestet.