Както знаете, SQLServer постига това с индексирани изгледи :
В SQLServer, за да се възползвате от тази техника, трябва да правите запитвания над изгледа, а не над таблиците. Това означава, че трябва да знаете за изгледа и индексите.
MySQL няма индексирани изгледи, но можете да симулирате поведението с таблица + тригери + индекси .
Вместо да създавате изглед, трябва да създадете индексирана таблица, тригер, за да поддържате таблицата с данни актуална, и след това трябва да направите заявка за новата си таблица вместо към вашите нормализирани таблици.
Трябва да прецените дали режийните разходи на операциите за запис компенсират подобрението в операциите за четене.
Редактирано:
Имайте предвид, че не винаги е необходимо да създавате нова таблица. Например, в тригер за връзка 1:N (главен-подробност), можете да запазите копие на поле от 'главната' таблица в таблицата 'подробности'. Във вашия случай:
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;
Забележете, че това е тригер преди вмъкване.
Сега заявката се пренаписва, както следва:
select * from tableOne t1
inner join tableTwo t2 on t1.tableTwoId = t2.id
where t1.objectId = '..'
order by t1.desnormalized_eventTime;
Отказ от отговорност:не е тестван.