Come sapete, SQLServer raggiunge questo obiettivo con viste indicizzate :
In SQLServer, per sfruttare questa tecnica, è necessario eseguire query sulla vista e non sulle tabelle. Ciò significa che dovresti conoscere la vista e gli indici.
MySQL non ha viste indicizzate, ma puoi simulare il comportamento con tabella + trigger + indici .
Invece di creare una vista, devi creare una tabella indicizzata, un trigger per mantenere aggiornata la tabella di dati, quindi devi interrogare la tua nuova tabella invece delle tabelle normalizzate.
È necessario valutare se l'overhead delle operazioni di scrittura compensa il miglioramento delle operazioni di lettura.
Modificato:
Si noti che non è sempre necessario creare una nuova tabella. Ad esempio, in un trigger di relazione 1:N (principale-dettaglio), puoi conservare una copia di un campo dalla tabella "principale" nella tabella "dettaglio". Nel tuo caso:
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;
Si noti che questo è un trigger prima dell'inserimento.
Ora, la query viene riscritta come segue:
select * from tableOne t1
inner join tableTwo t2 on t1.tableTwoId = t2.id
where t1.objectId = '..'
order by t1.desnormalized_eventTime;
Disclaimer:non testato.