sql >> Base de Datos >  >> RDS >> Mysql

¿Es posible la indexación de tablas cruzadas?

Como sabe, SQLServer logra esto con vistas indexadas :

En SQLServer, para aprovechar esta técnica, debe consultar sobre la vista y no sobre las tablas. Eso significa que debe conocer la vista y los índices.

MySQL no tiene vistas indexadas, pero puede simular el comportamiento con tabla + disparadores + índices .

En lugar de crear una vista, debe crear una tabla indexada, un disparador para mantener la tabla de datos actualizada y luego debe consultar su nueva tabla en lugar de sus tablas normalizadas.

Debe evaluar si la sobrecarga de las operaciones de escritura compensa la mejora en las operaciones de lectura.

Editado:

Tenga en cuenta que no siempre es necesario crear una nueva tabla. Por ejemplo, en un activador de relación 1:N (principal-detalle), puede conservar una copia de un campo de la tabla "principal" en la tabla "detalle". En su 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;

Tenga en cuenta que este es un activador de inserción anterior.

Ahora, la consulta se reescribe de la siguiente manera:

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

Descargo de responsabilidad:no probado.