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

Er krydstabelindeksering mulig?

Som du ved, opnår SQLServer dette med indekserede visninger :

I SQLServer skal du forespørge over visningen og ikke over tabellerne for at drage fordel af denne teknik. Det betyder, at du bør kende til visningen og indekserne.

MySQL har ikke indekserede visninger, men du kan simulere adfærden med tabel + triggere + indekser .

I stedet for at oprette en visning skal du oprette en indekseret tabel, en trigger for at holde datatabellen opdateret, og så skal du forespørge på din nye tabel i stedet for dine normaliserede tabeller.

Du skal vurdere, om overhead af skriveoperationer opvejer forbedringen i læseoperationer.

Redigeret:

Bemærk, at det ikke altid er nødvendigt at oprette en ny tabel. For eksempel, i en 1:N-relation (master-detalje)-udløser kan du beholde en kopi af et felt fra 'master'-tabellen til 'detail'-tabellen. I dit tilfælde:

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;

Bemærk, at dette er en trigger før indsættelse.

Nu omskrives forespørgslen som følger:

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

Ansvarsfraskrivelse:ikke testet.



  1. Forbindelsespooling med Pgbouncer på PostgreSQL 9.0

  2. Fjerner uønsket tegn fra kolonne

  3. Udlejning af biler er lige så enkelt som at køre:En datamodel for et biludlejningsfirma

  4. Hvad er InnoDB og MyISAM i MySQL?