Como você sabe, o SQLServer consegue isso com visualizações indexadas :
No SQLServer, para aproveitar essa técnica, você deve consultar sobre a exibição e não sobre as tabelas. Isso significa que você deve saber sobre a exibição e os índices.
O MySQL não possui visualizações indexadas, mas você pode simular o comportamento com tabela + gatilhos + índices .
Em vez de criar uma exibição, você deve criar uma tabela indexada, um gatilho para manter a tabela de dados atualizada e, em seguida, deve consultar sua nova tabela em vez de suas tabelas normalizadas.
Você deve avaliar se a sobrecarga das operações de gravação compensa a melhoria nas operações de leitura.
Editado:
Observe que nem sempre é necessário criar uma nova tabela. Por exemplo, em um gatilho de relacionamento 1:N (mestre-detalhe), você pode manter uma cópia de um campo da tabela 'mestre' na tabela 'detalhe'. No seu 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;
Observe que este é um gatilho antes de inserir.
Agora, a consulta é reescrita da seguinte forma:
select * from tableOne t1
inner join tableTwo t2 on t1.tableTwoId = t2.id
where t1.objectId = '..'
order by t1.desnormalized_eventTime;
Isenção de responsabilidade:não testado.