Devo definir um índice separado na email
coluna (para fins de pesquisa) ou o índice é adicionado "automaticamente" junto com a UNIQ_EMAIL_USER
restrição?
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;
EDITAR : conforme sugerido por Corbin, perguntei EXPLAIN SELECT * FROM customer WHERE email = 'address'
em uma tabela vazia. Esse é o resultado, não sei interpretar:
id select_type type possible_keys key key_len ref rows Extra
1 SIMPLE ALL NULL NULL NULL NULL 1 Using where
Ao adicionar um IXD_EMAIL à tabela, a mesma consulta mostra:
id select_type type possible_keys key key_len ref rows Extra
1 SIMPLE ref IDX_EMAIL IDX_EMAIL 257 const 1 Using where
Respostas:
Uma chave exclusiva é um caso especial de índice, agindo como um índice regular com verificação adicional de exclusividade. Usando
SHOW INDEXES FROM customer
você pode ver que suas chaves exclusivas são, na verdade, índices do tipo B-tree.Um índice composto de
(email, user_id)
for suficiente, você não precisa de um índice separado apenas em e-mail - MySQL pode usar peças mais à esquerda de um índice composto. Pode haver alguns casos de fronteira em que o tamanho de um índice pode tornar suas consultas mais lentas, mas você não deve se preocupar com eles até que realmente os encontre.Quanto ao teste de uso do índice, primeiro você deve preencher sua tabela com alguns dados para fazer o otimizador pensar que realmente vale a pena usar esse índice.
fonte
EXPLAIN
teste mostra valores falsos por causa da tabela vazia?user_id
first e entãoemail
ela não aparece emEXPLAIN
. Você está ciente disto?