¿Una restricción ÚNICA crea automáticamente un ÍNDICE en los campos?

97

¿Debo definir un índice separado en la emailcolumna (para fines de búsqueda), o el índice se agrega "automáticamente" junto con la UNIQ_EMAIL_USERrestricció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
gremo
fuente
1
Una restricción ÚNICA no requiere técnicamente un índice ... pero no estoy seguro de cómo lo define el estándar o MySQL (¿qué backend, por cierto?) Lo implementa. Todo lo que puedo encontrar en MySQL de forma manual y rápida es "Un índice ÚNICO crea una restricción tal que todos los valores en el índice deben ser distintos".
Debe implementar y probar con índices individuales vs de cobertura (también conocido como compuesto, más de una columna). Depende del uso y los datos.
OMG Ponies
3
Estoy 99% seguro de que sí crea un índice. Simplemente cree una tabla con un único y luego haga una explicación en una selección con un dónde.
Corbin
@Corbin lo hizo, ¿cómo debo interpretar el resultado?
gremo
¿Usó la restricción única como índice? Por cierto, es posible que deba usar una tabla significativamente grande, o simplemente puede hacer un escaneo de la tabla.
Corbin

Respuestas:

115

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 customerpuede 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.

piotrm
fuente
Entonces EXPLAIN, ¿la prueba muestra valores falsos debido a la tabla vacía?
gremo
No estoy seguro de cómo logró obtener ese resultado de explicación, acabo de copiar la definición de su tabla y la misma explicación muestra UNIQ_EMAIL_USER como clave posible, ¿puede volver a verificarla?
piotrm
Ok, encontré el truco. Cuando la restricción se define usando user_idprimero y luego emailno aparece en EXPLAIN. ¿Estás consciente de esto?
Gremo
10
No funciona porque el correo electrónico no es la parte más a la izquierda del par (user_id, email). No puede bajar por el árbol b para encontrar su fila usando solo la parte más a la derecha.
piotrm