Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

A indexação entre tabelas é possível?


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.