sql >> Database >  >> RDS >> Mysql

Is kruistabelindexering mogelijk?

Zoals u weet, bereikt SQLServer dit met geïndexeerde weergaven :

Om in SQLServer van deze techniek te profiteren, moet u query's uitvoeren op de view en niet op de tabellen. Dat betekent dat u op de hoogte moet zijn van de weergave en indexen.

MySQL heeft geen geïndexeerde weergaven, maar u kunt het gedrag simuleren met tabel + triggers + indexen .

In plaats van een weergave te maken, moet u een geïndexeerde tabel maken, een trigger om de gegevenstabel up-to-date te houden, en vervolgens moet u uw nieuwe tabel opvragen in plaats van uw genormaliseerde tabellen.

U moet evalueren of de overhead van schrijfbewerkingen de verbetering van leesbewerkingen compenseert.

Bewerkt:

Merk op dat het niet altijd nodig is om een ​​nieuwe tabel aan te maken. In een trigger voor een 1:N-relatie (hoofd-detail) kunt u bijvoorbeeld een kopie van een veld uit de 'hoofd'-tabel in de 'detail'-tabel bewaren. In jouw geval:

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;

Merk op dat dit een trigger is voor het invoegen.

Nu wordt de query als volgt herschreven:

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

Disclaimer:niet getest.



  1. Hoe het root-wachtwoord van MySQL of MariaDB in Linux te veranderen

  2. MySQL Toon indexen in database

  3. MySQL LEFT JOIN, GROUP BY en ORDER BY werkt niet zoals vereist

  4. VARCHAR- en NVARCHAR-gegevenstypen in SQL Server