sql >> Databasteknik >  >> RDS >> Mysql

Är korstabellindexering möjlig?

Som du vet uppnår SQLServer detta med indexerade vyer :

I SQLServer, för att dra fördel av denna teknik, måste du fråga över vyn och inte över tabellerna. Det betyder att du bör känna till vyn och indexen.

MySQL har inga indexerade vyer, men du kan simulera beteendet med tabell + triggers + index .

Istället för att skapa en vy måste du skapa en indexerad tabell, en utlösare för att hålla datatabellen uppdaterad, och sedan måste du fråga din nya tabell istället för dina normaliserade tabeller.

Du måste utvärdera om overheaden för skrivoperationer uppväger förbättringen av läsoperationer.

Redigerad:

Observera att det inte alltid är nödvändigt att skapa en ny tabell. Till exempel, i en 1:N-relation (huvud-detalj)-utlösare, kan du behålla en kopia av ett fält från "master"-tabellen till "detalj"-tabellen. I ditt fall:

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;

Observera att detta är en trigger före infogning.

Nu skrivs frågan om enligt följande:

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

Ansvarsfriskrivning:ej testad.



  1. mySQL-returindex efter infogning

  2. DAYOFMONTH() Exempel – MySQL

  3. Hur kan jag göra tre tabell JOINs i en UPDATE-fråga?

  4. Varför Mysqls Group By och Oracles Group by beteenden är olika