¿Debo definir un índice separado en la email
columna (para fines de búsqueda), o el índice se agrega "automáticamente" junto con la UNIQ_EMAIL_USER
restricción?
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 : como lo sugirió Corbin, lo consulté EXPLAIN SELECT * FROM customer WHERE email = 'address'
en una mesa vacía. Este es el resultado, no sé cómo interpretarlo:
id select_type type possible_keys key key_len ref rows Extra
1 SIMPLE ALL NULL NULL NULL NULL 1 Using where
Al agregar un IXD_EMAIL a la tabla, la misma consulta muestra:
id select_type type possible_keys key key_len ref rows Extra
1 SIMPLE ref IDX_EMAIL IDX_EMAIL 257 const 1 Using where
Respuestas:
Una clave única es un caso especial de índice, que actúa como un índice regular con verificación adicional de unicidad. Usando
SHOW INDEXES FROM customer
puede ver que sus claves únicas son, de hecho, índices de tipo B-tree.Un índice compuesto sobre
(email, user_id)
es suficiente, no es necesario un índice separado en un solo correo electrónico - MySQL puede utilizar piezas más a la izquierda de un índice compuesto. Puede haber algunos casos fronterizos en los que el tamaño de un índice pueda ralentizar sus consultas, pero no debe preocuparse por ellos hasta que realmente se encuentre con ellos.En cuanto a probar el uso del índice, primero debe llenar su tabla con algunos datos para que el optimizador piense que realmente vale la pena usar ese índice.
fuente
EXPLAIN
, ¿la prueba muestra valores falsos debido a la tabla vacía?user_id
primero y luegoemail
no aparece enEXPLAIN
. ¿Estás consciente de esto?