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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.