Czy musisz jawnie utworzyć indeks, czy jest on domyślny podczas definiowania klucza podstawowego? Czy odpowiedź jest taka sama dla MyISAM i InnoDB?
Czy musisz jawnie utworzyć indeks, czy jest on domyślny podczas definiowania klucza podstawowego? Czy odpowiedź jest taka sama dla MyISAM i InnoDB?
Odpowiedzi:
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.
Według http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html wydaje się, że jest to domniemane
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.
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.
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)
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 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ą.
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
!
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.