Czy UNIKALNE ograniczenie automatycznie tworzy INDEKS w polu (polach)?

99

Czy powinienem zdefiniować oddzielny indeks w emailkolumnie (do celów wyszukiwania), czy indeks jest dodawany „automatycznie” wraz z UNIQ_EMAIL_USERograniczeniem?

CREATE TABLE IF NOT EXISTS `customer` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `first` varchar(255) NOT NULL,
  `last` varchar(255) NOT NULL,
  `slug` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNIQ_SLUG` (`slug`),
  UNIQUE KEY `UNIQ_EMAIL_USER` (`email`,`user_id`),
  KEY `IDX_USER` (`user_id`)
) ENGINE=InnoDB;

EDYCJA : zgodnie z sugestią Corbina, o którą prosiłem EXPLAIN SELECT * FROM customer WHERE email = 'address'na pustym stole. Oto wynik, nie wiem, jak go zinterpretować:

id select_type type possible_keys key  key_len ref  rows Extra
1  SIMPLE      ALL  NULL          NULL NULL    NULL 1    Using where

Podczas dodawania IXD_EMAIL do tabeli to samo zapytanie pokazuje:

id select_type type possible_keys key       key_len ref   rows Extra
1  SIMPLE      ref  IDX_EMAIL     IDX_EMAIL 257     const 1    Using where
gremo
źródło
1
Unikalne ograniczenie nie wymaga technicznie indeksu ... ale nie jestem pewien, jak definiuje je standard lub MySQL (który backend, przy okazji?) Je implementuje. Wszystko, co mogę szybko znaleźć w MySQL ręcznie, to „UNIQUE index tworzy takie ograniczenie, że wszystkie wartości w indeksie muszą być różne.”.
Musisz wdrożyć i przetestować indeksy indywidualne i pokrywające (złożone jako AKA - więcej niż jedna kolumna). To zależy od zastosowania i danych.
OMG Kucyki,
3
Jestem w 99% pewien, że rzeczywiście tworzy indeks. Po prostu utwórz tabelę z unikalnym, a następnie objaśnij wybór z miejscem.
Corbin
@Corbin to zrobił, jak mam zinterpretować wynik?
gremo
Czy używał unikalnego ograniczenia jako indeksu? Nawiasem mówiąc, może być konieczne użycie znacznie dużej tabeli lub może po prostu wykonać skanowanie tabeli.
Corbin

Odpowiedzi:

116

Unikalny klucz jest szczególnym przypadkiem indeksu, działającego jak zwykły indeks z dodatkiem sprawdzania niepowtarzalności. Używając SHOW INDEXES FROM customermożesz zobaczyć, że twoje unikalne klucze są w rzeczywistości indeksami typu B-drzewa.

Kompozytowy wskaźnik na (email, user_id)to wystarczy, nie trzeba osobnego indeksu tylko email - MySQL można używać lewostronne części z indeksu kompozytowego. Mogą wystąpić przypadki graniczne, w których rozmiar indeksu może spowolnić zapytania, ale nie powinieneś się nimi martwić, dopóki ich nie napotkasz.

Jeśli chodzi o testowanie użycia indeksu, należy najpierw wypełnić tabelę danymi, aby optymalizator uznał, że warto użyć tego indeksu.

piotrm
źródło
Więc EXPLAINtest pokazuje fałszywe wartości z powodu pustej tabeli?
gremo
Nie jestem pewien, jak udało ci się uzyskać ten wynik wyjaśnienia, właśnie skopiowałem definicję tabeli i to samo wyjaśnienie pokazuje klucz UNIQ_EMAIL_USER jako możliwy, czy możesz go ponownie sprawdzić?
piotrm
Ok, znalazłem sztuczkę. Gdy ograniczenie jest zdefiniowane przy użyciu user_idnajpierw, a następnie emailnie pojawia się w EXPLAIN. Czy jesteś tego świadomy?
gremo
12
To nie działa, ponieważ e-mail nie jest skrajną lewą częścią pary (identyfikator_użytkownika, e-mail). Nie możesz zejść w dół drzewa b, aby znaleźć wiersz, używając tylko skrajnej prawej części.
piotrm