Mysql
 sql >> Database >  >> RDS >> Mysql

È possibile l'indicizzazione tra tabelle?

Come sapete, SQLServer raggiunge questo obiettivo con viste indicizzate :

In SQLServer, per sfruttare questa tecnica, è necessario eseguire query sulla vista e non sulle tabelle. Ciò significa che dovresti conoscere la vista e gli indici.

MySQL non ha viste indicizzate, ma puoi simulare il comportamento con tabella + trigger + indici .

Invece di creare una vista, devi creare una tabella indicizzata, un trigger per mantenere aggiornata la tabella di dati, quindi devi interrogare la tua nuova tabella invece delle tabelle normalizzate.

È necessario valutare se l'overhead delle operazioni di scrittura compensa il miglioramento delle operazioni di lettura.

Modificato:

Si noti che non è sempre necessario creare una nuova tabella. Ad esempio, in un trigger di relazione 1:N (principale-dettaglio), puoi conservare una copia di un campo dalla tabella "principale" nella tabella "dettaglio". Nel tuo 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;

Si noti che questo è un trigger prima dell'inserimento.

Ora, la query viene riscritta come segue:

select * from tableOne t1 
  inner join tableTwo t2 on t1.tableTwoId = t2.id
  where t1.objectId = '..'
  order by t1.desnormalized_eventTime;

Disclaimer:non testato.