Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak poprawnie zindeksować tabelę łączącą dla połączenia wiele-do-wielu w MySQL?

To zależy od tego, jak szukasz.

Jeśli szukasz w ten sposób:

/* 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

wtedy potrzebujesz:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_1, table_2)

W tym przypadku table1 będzie prowadzić w NESTED LOOPS a twój indeks będzie użyteczny tylko wtedy, gdy table1 jest indeksowany jako pierwszy.

Jeśli szukasz w ten sposób:

/* 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

wtedy potrzebujesz:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_2, table_1)

z powyższych powodów.

Nie potrzebujesz tutaj niezależnych indeksów. Indeks złożony może być używany wszędzie tam, gdzie można użyć zwykłego indeksu w pierwszej kolumnie. Jeśli użyjesz niezależnych indeksów, nie będziesz w stanie efektywnie wyszukiwać obu wartości:

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

W przypadku takiego zapytania potrzebujesz co najmniej jednego indeksu w obu kolumnach.

Posiadanie dodatkowego indeksu dla drugiego pola nigdy nie jest złe:

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

Klucz podstawowy będzie używany do wyszukiwania on both values oraz dla wyszukiwań opartych na wartości table_1 , dodatkowy indeks zostanie użyty do wyszukiwania na podstawie wartości table_2 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL GROUP &COUNT Wiele tabel

  2. Struktura bazy danych do przechowywania statystyk według dnia, tygodnia, miesiąca, roku

  3. moja najlepsza praktyka sql z php do liczenia wierszy

  4. darmowy wynik pdo

  5. Sprawdź, czy kolumna/klucz istnieje?