MySQL
Indeksy i klucze
Szukaj…
Składnia
- Utwórz prosty indeks
UTWÓRZ INDEKS nazwa_indeksu NA nazwa_tabeli ( nazwa_kolumny1 [, nazwa_kolumny2 , ...])
- Utwórz unikalny indeks
UTWÓRZ UNIKALNY INDEKS nazwa_indeksu NA nazwa_tabeli ( nazwa_kolumny1 [, nazwa_kolumny2 , ...]
- Indeks spadku
DROP INDEX nazwa_indeksu WŁĄCZ nazwa_bloku [ opcja algorytmu | lock_option ] ...
algorytm_option: ALGORITHM [=] {DEFAULT | INPLACE | COPY}
lock_option: LOCK [=] {DOMYŚLNIE | BRAK | UDOSTĘPNIONY | WYŁĄCZNIE}
Uwagi
Pojęcia
Indeks w tabeli MySQL działa jak indeks w książce.
Załóżmy, że masz książkę o bazach danych i chcesz znaleźć informacje na temat, powiedzmy, pamięci. Bez indeksu (zakładając, że nie ma innej pomocy, takiej jak spis treści), będziesz musiał przeglądać strony jeden po drugim, dopóki nie znajdziesz tematu (to jest „pełne skanowanie tabeli”). Z drugiej strony indeks ma listę słów kluczowych, więc zapoznaj się z indeksem i sprawdź, czy pamięć jest wymieniona na stronach 113-120, 231 i 354. Następnie możesz przejść do tych stron bezpośrednio, bez wyszukiwania (to jest wyszukiwanie z indeksem, nieco szybciej).
Oczywiście przydatność indeksu zależy od wielu rzeczy - kilku przykładów, wykorzystujących powyższe porównanie:
- Jeśli miałeś książkę o bazach danych i zaindeksowałeś słowo „baza danych”, możesz zauważyć, że jest ono wymienione na stronach 1-59, 61-290 i 292-400. To dużo stron, w takim przypadku indeks nie pomaga, a przeglądanie stron może być szybsze. (W bazie danych jest to „słaba selektywność”).
- W przypadku 10-stronicowej książki nie ma sensu tworzyć indeksu, ponieważ może to oznaczać, że 10-stronicowa książka poprzedzona jest 5-stronicowym indeksem, co jest po prostu głupie - wystarczy zeskanować 10 stron i gotowe .
- Indeks także musi być przydatny - na ogół nie ma sensu indeksować, na przykład częstotliwość litery „L” na stronie.
Utwórz indeks
-- Create an index for column 'name' in table 'my_table'
CREATE INDEX idx_name ON my_table(name);
Utwórz unikalny indeks
Unikalny indeks zapobiega wstawianiu zduplikowanych danych do tabeli. Wartości NULL
można wstawiać do kolumn tworzących część unikalnego indeksu (ponieważ z definicji wartość NULL
różni się od dowolnej innej wartości, w tym innej wartości NULL
)
-- Creates a unique index for column 'name' in table 'my_table'
CREATE UNIQUE INDEX idx_name ON my_table(name);
Upuść indeks
-- Drop an index for column 'name' in table 'my_table'
DROP INDEX idx_name ON my_table;
Utwórz indeks złożony
Spowoduje to utworzenie złożonego indeksu obu kluczy, mystring
i mydatetime
oraz przyspieszy zapytania z obiema kolumnami w klauzuli WHERE
.
CREATE INDEX idx_mycol_myothercol ON my_table(mycol, myothercol)
Uwaga: kolejność jest ważna! Jeśli wyszukiwane hasło nie zawiera obu kolumn w klauzuli WHERE
, może używać tylko indeksu skrajnie lewego. W takim przypadku zapytanie z mycol
w WHERE
użyje indeksu, zapytanie wyszukujące myothercol
bez szukania mycol
nie . Aby uzyskać więcej informacji, sprawdź ten post na blogu .
Uwaga: Ze względu na sposób działania BTREE kolumny, które są zwykle wyszukiwane w zakresach, powinny mieć najwyższą wartość. Na przykład, kolumny DATETIME
są zwykle odpytywane, jak WHERE datecol > '2016-01-01 00:00:00'
. Indeksy BTREE bardzo efektywnie obsługują zakresy, ale tylko wtedy, gdy kolumna będąca zapytaniem o zakres jest ostatnią w indeksie złożonym.
Klawisz AUTO_INCREMENT
CREATE TABLE (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY(id),
... );
Główne uwagi:
- Zaczyna się od 1 i zwiększa o 1 automatycznie, jeśli nie określisz go w
INSERT
lub określisz jakoNULL
. - Identyfikatory zawsze różnią się od siebie, ale ...
- Nie przyjmuj żadnych założeń (żadnych luk, kolejno generowanych, nieużywanych ponownie itp.) Dotyczących wartości identyfikatora innych niż unikalność w danym momencie.
Subtelne nuty:
- Po ponownym uruchomieniu serwera „następna” wartość jest „obliczana” jako
MAX(id)+1
. - Jeśli ostatnią operacją przed zamknięciem lub awarią było usunięcie najwyższego identyfikatora, identyfikator ten można ponownie wykorzystać (jest to zależne od silnika). Dlatego nie ufaj auto_increments, że będą trwale unikalne ; są wyjątkowe tylko w dowolnym momencie.
- W przypadku rozwiązań z wieloma wzorcami lub klastrami zobacz
auto_increment_offset
iauto_increment_increment
. - Można mieć coś innego jako
PRIMARY KEY
i po prostu wykonaćINDEX(id)
. (W niektórych sytuacjach jest to optymalizacja). - Korzystanie z
AUTO_INCREMENT
jako „PARTITION
klawisza” rzadko jest korzystna; Zrób coś inaczej. - Różne operacje mogą „spalić” wartości. Dzieje się tak, gdy wstępnie przydzielają wartości, a następnie ich nie używają:
INSERT IGNORE
(z kluczem dup),REPLACE
(czyliDELETE
plusINSERT
) i inne.ROLLBACK
jest kolejną przyczyną luk w identyfikatorach. - W replikacji nie można ufać identyfikatorom, że dotrą do urządzeń podrzędnych w porządku rosnącym. Chociaż identyfikatory są przypisywane w kolejnej kolejności, instrukcje InnoDB są wysyłane do urządzeń podrzędnych w kolejności
COMMIT
.