Seperti yang Anda ketahui, SQLServer mencapai ini dengan tampilan yang diindeks :
Di SQLServer, untuk memanfaatkan teknik ini, Anda harus melakukan kueri pada tampilan dan bukan tabel. Itu artinya Anda harus tahu tentang tampilan dan indeks.
MySQL tidak memiliki tampilan yang diindeks, tetapi Anda dapat mensimulasikan perilaku dengan tabel + pemicu + indeks .
Alih-alih membuat tampilan, Anda harus membuat tabel yang diindeks, pemicu untuk menjaga agar tabel data tetap terbaru, dan kemudian Anda harus membuat kueri tabel baru, bukan tabel yang dinormalisasi.
Anda harus mengevaluasi apakah overhead operasi tulis mengimbangi peningkatan dalam operasi baca.
Diedit:
Perhatikan bahwa tidak selalu perlu membuat tabel baru. Misalnya, dalam pemicu hubungan 1:N (detail master), Anda dapat menyimpan salinan bidang dari tabel 'master' ke tabel 'detail'. Dalam kasus Anda:
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;
Perhatikan bahwa ini adalah pemicu sebelum penyisipan.
Sekarang, kueri ditulis ulang sebagai berikut:
select * from tableOne t1
inner join tableTwo t2 on t1.tableTwoId = t2.id
where t1.objectId = '..'
order by t1.desnormalized_eventTime;
Penafian:tidak diuji.