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

Hvordan indekserer man en linktabel korrekt til mange-til-mange-forbindelse i MySQL?

Det afhænger af, hvordan du søger.

Hvis du søger sådan her:

/* Given a value from table1, find all related values from table2 */ SELECT * FROM table1 t1 JOIN table_table tt ON (tt.table_1 = t1.id) JOIN table2 t2 ON (t2.id = tt.table_2) WHERE t1.id = @id

så skal du bruge:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_1, table_2)
 

I dette tilfælde table1 vil føre i NESTED LOOPS og dit indeks vil kun være brugbart, når table1 indekseres først.

Hvis du søger sådan her:

/* Given a value from table2, find all related values from table1 */ SELECT * FROM table2 t2 JOIN table_table tt ON (tt.table_2 = t2.id) JOIN table1 t1 ON (t1.id = tt.table_1) WHERE t2.id = @id

så skal du bruge:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_2, table_1)
 

af årsagerne ovenfor.

Du behøver ikke uafhængige indekser her. Et sammensat indeks kan bruges overalt, hvor et almindeligt indeks på den første kolonne kan bruges. Hvis du bruger uafhængige indekser, vil du ikke være i stand til at søge effektivt efter begge værdier:

/* Check if relationship exists between two given values */
SELECT 1
FROM table_table
WHERE table_1 = @id1
  AND table_2 = @id2
 

For en forespørgsel som denne skal du have mindst ét ​​indeks på begge kolonner.

Det er aldrig dårligt at have et ekstra indeks for det andet felt:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 PRIMARY KEY (table_1, table_2)
CREATE INDEX ix_table2 ON table_table (table_2)
 

Primær nøgle vil blive brugt til søgninger on both values og for søgninger baseret på værdien af ​​table_1 , vil yderligere indeks blive brugt til søgninger baseret på værdien af ​​table_2 .



  1. Hvordan opretter man forbindelse til Mysql ved hjælp af C#?

  2. Korrekt databasemodel for et brugerfeedbacksystem (en interessant case)

  3. Ugyldig JSON-tekst i argument 2 - json_contains i MySQL 5.7.8

  4. Databaseautomatisering bag Sveriges nye elektroniske identitet Freja eID