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

DOS i DONT dla indeksów

Ogólnie rzecz biorąc:

1. Nie dodawaj indeksu, chyba że faktycznie go potrzebujesz.

Każdy indeks spowalnia zapis...

2. Indeks zostanie użyty w klauzulach where:

-- index on foo (bar)
select bar from foo where bar = :bar;

Z tego samego powodu będzie on używany w odniesieniach do kluczy obcych (w obu tabelach).

-- index on foo (bar) if baz (bar) is frequently updated/deleted.
create table foo (bar references baz (bar)); 

3. Indeks będzie używany do sortowania, zwłaszcza gdy jest powiązany z limitem:

-- index on foo (bar)
select bar from foo order by bar limit 10;

4. Indeksy wielokolumnowe są czasami przydatne, gdy oba mają zastosowanie 2. i 3.

W tym przypadku najpierw umieść warunki gdzie, a klucz sortowania na końcu:

-- index on foo (baz, bar)
select bar from foo where baz between :baz1 and :baz2 group by bar;

5. Aktualizuj statystyki tabeli.

Jeśli statystyki tabeli są śmieciami, istnieje małe prawdopodobieństwo, że optymalizator użyje Twoich indeksów. W razie potrzeby ręcznie odkurz/przeanalizuj bazę danych.

6. Użycie indeksu zależy od podziału tabeli.

Po przekroczeniu pewnego progu pobranych wierszy wykonanie pełnego skanowania tabeli będzie szybsze. Jeśli Twój indeks znajduje się na polu logicznym, które mniej więcej dzieli tabelę na dwie części, nigdy nie zostanie użyty.

Podobnie, jeśli dane są przechowywane w taki sposób, że skanowanie indeksu prawdopodobnie zakończy się losowym dostępem do prawie każdej odpowiedniej strony dysku dla tej tabeli, planista będzie preferował pełne skanowanie tabeli.

7. Rozważ indeksy częściowe/wyrażenia, jeśli są dostępne.

Jeśli masz pole, które ma taką samą wartość, z wyjątkiem 10% Twoich wierszy, rozważ jego częściowy indeks (tj. tam, gdzie nie ma tej wartości). Skutkuje to znacznie mniejszym wskaźnikiem bez ograniczania jego rzeczywistej użyteczności.

Jeśli stale wysyłasz zapytania dotyczące wyrażenia zastosowanego do kolumny, a platforma oferuje indeksy wyrażeń, rozważ dodanie do niego indeksu. W przypadku użycia wyrażenie nie zostanie ocenione dla każdego wiersza.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak ograniczyć dostęp do portu MySQL

  2. Jak utworzyć bazę danych MySQL w cPanel?

  3. Dlaczego password_verify zwraca wartość false?

  4. Najlepsze praktyki mysqldump:Część 2 – Przewodnik po migracji

  5. Wartość strefy czasowej serwera „AEST” jest nierozpoznana lub reprezentuje więcej niż jedną strefę czasową