Sollte ich einen separaten Index für die email
Spalte definieren (zu Suchzwecken), oder wird der Index "automatisch" zusammen mit einer UNIQ_EMAIL_USER
Einschrä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
Antworten:
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 customer
Sie 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.
quelle
EXPLAIN
Test zeigt falsy Werte wegen des leeren Tisches?user_id
und dannemail
nicht in angezeigt wirdEXPLAIN
. Bist du dir dessen bewusst?