Jak wiesz, SQLServer osiąga to dzięki widokom indeksowanym :
W SQLServer, aby skorzystać z tej techniki, należy wykonywać zapytania dotyczące widoku, a nie tabel. Oznacza to, że powinieneś wiedzieć o widoku i indeksach.
MySQL nie ma widoków indeksowanych, ale możesz symulować zachowanie za pomocą tabeli + wyzwalaczy + indeksów .
Zamiast tworzyć widok, musisz utworzyć zindeksowaną tabelę, wyzwalacz, aby tabela danych była aktualna, a następnie musisz wysłać zapytanie do nowej tabeli zamiast do znormalizowanych tabel.
Musisz ocenić, czy narzut związany z operacjami zapisu równoważy poprawę w operacjach odczytu.
Edytowane:
Pamiętaj, że nie zawsze jest konieczne tworzenie nowej tabeli. Na przykład w wyzwalaczu relacji 1:N (główny-szczegółowy) można zachować kopię pola z tabeli „głównej” w tabeli „szczegółowej”. W Twoim przypadku:
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;
Zauważ, że jest to wyzwalacz przed wstawieniem.
Teraz zapytanie jest przepisane w następujący sposób:
select * from tableOne t1
inner join tableTwo t2 on t1.tableTwoId = t2.id
where t1.objectId = '..'
order by t1.desnormalized_eventTime;
Zastrzeżenie:nie testowano.