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 jako NULL .
  • 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 i auto_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 (czyli DELETE plus INSERT ) 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 .


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow