Czy klucz podstawowy jest automatycznie indeksowany w MySQL?

243

Czy musisz jawnie utworzyć indeks, czy jest on domyślny podczas definiowania klucza podstawowego? Czy odpowiedź jest taka sama dla MyISAM i InnoDB?

Alex Miller
źródło

Odpowiedzi:

294

Klucz podstawowy jest zawsze indeksowany. To samo dotyczy MyISAM i InnoDB i ogólnie dotyczy wszystkich silników pamięci masowej, które obsługują indeksy.

Emil H.
źródło
5
Jeśli klucz podstawowy jest zawsze indeksowany, dlaczego ludzie, mówiąc o architekturze / wydajności bazy danych, zawsze radzą początkującym użytkownikom SQL „upewnić się, że ich baza danych jest odpowiednio zindeksowana”?
tim peterson
35
@tim: Mówią ludziom, aby upewnić się, że wszelkie inne kolumny używane do filtrowania, grupowania lub sortowania również mają indeksy.
Emil H
15
Nie zapomnij też o dołączeniach! Indeksowane pola łączenia przyspieszają.
JustJohn
31

Według http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html wydaje się, że jest to domniemane

ist_lion
źródło
1
Znalazłem ten link, wyszukując, zanim zadałem pytanie. Ale wydaje mi się, że nie sugeruje mi to ani nic więcej w tym pytaniu.
Alex Miller
Strona, do której prowadzi link w tej odpowiedzi, nie wydaje się mówić o tym, czy klucz podstawowy jest również indeksem. Strony, do których prowadzi link w odpowiedzi z @fyrye, są bardziej odpowiednie.
George Hawkins,
16

Mimo że zapytano o to w 2009 roku, zorientowałem się, że opublikuję faktyczne odniesienie do dokumentacji MySQL na temat kluczy podstawowych. http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html

Klucz podstawowy dla tabeli reprezentuje kolumnę lub zestaw kolumn, które trzeba zastosować w swoich najważniejszych zapytaniami. Ma powiązany indeks dla szybkiej wydajności zapytań

Odwołanie do MySQL 5.0: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Większość indeksów MySQL ( PRIMARY KEY , UNIQUE, INDEX i FULLTEXT) jest przechowywana w drzewach B. Wyjątkiem są indeksy typów danych przestrzennych wykorzystujące drzewa R oraz że tabele MEMORY obsługują również indeksy skrótów.

fyrye
źródło
11

Klucz podstawowy jest domyślnie indeksowany zarówno dla MyISAM, jak i InnoDB. Możesz to sprawdzić za pomocą EXPLAIN w zapytaniu, które korzysta z klucza podstawowego.

Patrick Gryciuk
źródło
9

Nie musisz jawnie tworzyć indeksu dla klucza podstawowego ... jest to wykonywane domyślnie.

Stóg
źródło
8

To chyba odpowiedź

mysql> create table test(id int primary key, s varchar(20));
Query OK, 0 rows affected (0.06 sec)

mysql> show indexes from test \G
*************************** 1. row ***************************
        Table: test
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
1 row in set (0.00 sec)
Gość
źródło
7

Indeksy najlepiej stosować w kolumnach, które są często używane w klauzulach where oraz w wszelkiego rodzaju sortowaniu, takim jak „sortuj według”. Być może pracujesz nad bardziej złożoną bazą danych, więc dobrze jest pamiętać kilka prostych zasad.

  • Indeksy spowalniają wstawki i aktualizacje, więc chcesz ich używać ostrożnie w kolumnach, które są CZĘSTO aktualizowane.
  • Indeksy przyspieszają, gdzie klauzule i porządek. Pamiętaj, aby pomyśleć o tym, JAK Twoje dane będą wykorzystywane podczas tworzenia tabel. Jest jeszcze kilka rzeczy do zapamiętania. Jeśli twój stół jest bardzo mały, tj. Tylko kilku pracowników, gorzej jest użyć indeksu niż go pominąć i pozwolić mu wykonać skanowanie tabeli.

  • Indeksy naprawdę przydają się tylko w przypadku tabel zawierających wiele wierszy.

  • Inną rzeczą, o której należy pamiętać, jest to wada w sytuacji bazy danych naszych pracowników, że jeśli kolumna ma zmienną długość, indeksy (jak również większość MySQL) działają znacznie mniej wydajnie.

  • Nie zapomnij też o dołączeniach! Indeksowane pola łączenia przyspieszają.

Masood Ul Hassan
źródło
4

Klucz podstawowy jest zawsze automatycznie indeksowany i unikalny. Uważaj więc, aby nie tworzyć zbędnych indeksów.

Na przykład, jeśli utworzyłeś tabelę jako taką

CREATE TABLE mytable (foo INT NOT NULL PRIMARY KEY, bar INT NOT NULL, baz INT NOT NULL,
  UNIQUE(foo), INDEX(foo)) ENGINE=InnoDB;

ponieważ chcesz zaindeksować klucz podstawowy i wymusić na nim ograniczenie unikatowości, w rzeczywistości utworzyłbyś trzy indeksy foo!

dr_
źródło
0

Można myśleć o kolumnie klucza podstawowego jak o każdej innej indeksowanej kolumnie z ograniczeniami klucza podstawowego.

W większości przypadków użycia potrzebujemy zarówno klucza podstawowego, jak i indeksowanej kolumny / kolumn w tabeli, ponieważ nasze zapytania do tabeli mogą filtrować wiersze na podstawie kolumny / kolumn, które nie są kluczem podstawowym, w takim przypadku zwykle indeksujemy te kolumny / kolumny także.

Anshul Sharma
źródło