Erstellt eine EINZIGARTIGE Einschränkung automatisch einen INDEX für die Felder?

96

Sollte ich einen separaten Index für die emailSpalte definieren (zu Suchzwecken), oder wird der Index "automatisch" zusammen mit einer UNIQ_EMAIL_USEREinschränkung hinzugefügt ?

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;

EDIT : Wie von Corbin vorgeschlagen, habe ich EXPLAIN SELECT * FROM customer WHERE email = 'address'auf einem leeren Tisch nachgefragt. Dies ist das Ergebnis, ich weiß nicht, wie ich es interpretieren soll:

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

Beim Hinzufügen eines IXD_EMAIL zur Tabelle wird dieselbe Abfrage angezeigt:

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
quelle
1
Eine EINZIGARTIGE Einschränkung erfordert technisch gesehen keinen Index ... aber nicht sicher, wie der Standard ihn definiert oder MySQL (welches Backend übrigens?) Implementiert. Alles, was ich manuell in MySQL schnell finden kann, ist "Ein EINZIGARTIGER Index erstellt eine Einschränkung, sodass alle Werte im Index unterschiedlich sein müssen."
Sie müssen einzelne oder abdeckende Indizes (AKA-Verbund - mehr als eine Spalte) implementieren und testen. Dies hängt von der Verwendung und den Daten ab.
OMG Ponys
3
Ich bin mir zu 99% sicher, dass tatsächlich ein Index erstellt wird. Erstellen Sie einfach eine Tabelle mit einem eindeutigen und erklären Sie dann eine Auswahl mit einem Wo.
Corbin
@Corbin hat es getan, wie soll ich das Ergebnis interpretieren?
Gremo
Hat es die eindeutige Einschränkung als Index verwendet? Möglicherweise müssen Sie übrigens eine sehr große Tabelle verwenden, oder es wird nur ein Tabellenscan durchgeführt.
Corbin

Antworten:

114

Ein eindeutiger Schlüssel ist ein Sonderfall des Index, der sich wie ein regulärer Index verhält und zusätzlich auf Eindeutigkeit überprüft. Mit können SHOW INDEXES FROM customerSie sehen, dass Ihre eindeutigen Schlüssel tatsächlich Indizes vom Typ B-Baum sind.

Ein zusammengesetzter Index für (email, user_id)ist ausreichend. Sie benötigen keinen separaten Index nur für E-Mails. MySQL kann Teile eines zusammengesetzten Index ganz links verwenden. Es kann einige Grenzfälle geben, in denen die Größe eines Index Ihre Abfragen verlangsamen kann, aber Sie sollten sich keine Sorgen machen, bis Sie tatsächlich auf sie stoßen.

Um die Indexnutzung zu testen, sollten Sie zuerst Ihre Tabelle mit einigen Daten füllen, damit der Optimierer denkt, dass es sich tatsächlich lohnt, diesen Index zu verwenden.

piotrm
quelle
So EXPLAINTest zeigt falsy Werte wegen des leeren Tisches?
Gremo
Ich bin mir nicht sicher, wie Sie es geschafft haben, dieses Erklärungsergebnis zu erhalten. Ich habe gerade Ihre Tabellendefinition kopiert und dieselbe Erklärung zeigt UNIQ_EMAIL_USER als möglichen Schlüssel. Können Sie es bitte noch einmal überprüfen?
Piotrm
Ok, habe den Trick gefunden. Wenn die Einschränkung zuerst mit definiert wird user_idund dann emailnicht in angezeigt wird EXPLAIN. Bist du dir dessen bewusst?
Gremo
10
Es funktioniert nicht, da E-Mail nicht ganz links im Paar (user_id, email) steht. Sie können nicht den B-Baum hinuntergehen, um Ihre Reihe nur mit dem Teil ganz rechts zu finden.
Piotrm