Comme vous le savez, SQLServer y parvient avec vues indexées :
Dans SQLServer, pour tirer parti de cette technique, vous devez interroger la vue et non les tables. Cela signifie que vous devez connaître la vue et les index.
MySQL n'a pas de vues indexées, mais vous pouvez simuler le comportement avec table + déclencheurs + index .
Au lieu de créer une vue, vous devez créer une table indexée, un déclencheur pour maintenir la table de données à jour, puis vous devez interroger votre nouvelle table au lieu de vos tables normalisées.
Vous devez évaluer si la surcharge des opérations d'écriture compense l'amélioration des opérations de lecture.
Modifié :
Notez qu'il n'est pas toujours nécessaire de créer une nouvelle table. Par exemple, dans un déclencheur de relation 1:N (maître-détail), vous pouvez conserver une copie d'un champ de la table 'maître' dans la table 'détail'. Dans votre cas :
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;
Notez qu'il s'agit d'un déclencheur avant insertion.
Maintenant, la requête est réécrite comme suit :
select * from tableOne t1
inner join tableTwo t2 on t1.tableTwoId = t2.id
where t1.objectId = '..'
order by t1.desnormalized_eventTime;
Avis de non-responsabilité :non testé.