Debo definir un índice independiente en el email columna (para propósitos de búsqueda), o es el índice es «automáticamente», agregó, junto con 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 se sugirió por Corbin me preguntó por EXPLAIN SELECT * FROM customer WHERE email = 'address' en la tabla 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

Mientras que la adición de un IXD_EMAIL a la tabla de 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
  • Una ÚNICA restricción de no técnicamente se requiere un índice … pero no estoy seguro de cómo el estándar define o MySQL (back-end, por cierto?) implementa. Todo lo que puede encontrar en el MySQL manualmente rápidamente es «UN índice ÚNICO crea una restricción de tal manera que todos los valores en el índice debe ser distinto.».
  • Usted necesidad de aplicar & prueba individual vs cobertura (también conocido como compuesto – más de una columna) de los índices. Depende del uso, y de los datos.
  • Estoy 99% seguro de que en efecto, crear un índice. Sólo tienes que crear una tabla con un único, a continuación, hacer un explicar en un select con un donde.
  • lo hizo, ¿cómo debo interpretar el resultado?
  • Hizo uso de la restricción única como un índice? Puede que necesite utilizar una gran mesa por el camino, o que sólo puede hacer un examen de la tabla.
  • ver mis ediciones.
  • Como un aparte, en Oracle, una restricción unique implícitamente crear un índice con una no muy útil el nombre como «SYS_…». Por lo que puede ser útil para crear tu primera tabla, a continuación, crear un índice único con un bonito nombre como <table_col_uk> en el pk columna, a continuación, hacer un «alter table … add constraint <table_col_pk> clave principal … usando el índice de table_col_uk». De esa manera, si se produce un error (por ejemplo la «infracción de clave única en table_col_uk»), se sabe que la tabla y la columna de la derecha del palo con tener que acudir a los diccionarios de datos (como se haría con un SYS_… nombre). Pero «utilizando el índice de» Oracle no es de Mysql.

InformationsquelleAutor gremo | 2012-03-19

1 Comentario

  1. 99

    Una clave única es un caso especial de índice, actuando como un índice normal con el agregado de la comprobación de la singularidad. El uso de SHOW INDEXES FROM customer usted puede ver sus claves únicas son, de hecho, B-tipo de árbol de índices.

    Un índice compuesto de (correo electrónico,user_id) es suficiente, no es necesario un índice independiente en correo electrónico sólo – mysql puede utilizar más a la izquierda partes de un índice compuesto. Puede haber algunos casos fronterizos donde el tamaño de un índice puede ralentizar sus consultas, pero usted no debe preocuparse acerca de ellos hasta que realmente se ejecute en ellos.

    Como pruebas de la utilización de índices usted debe llenar su primera tabla con algunos datos para hacer el optimizador de pensar que es en realidad vale la pena utilizar el índice.

    • Así EXPLAIN prueba muestra falsy valores, ya que de la mesa vacía?
    • No estoy seguro de cómo se las arregló para conseguir que explicar resultado, he copiado la definición de la tabla y el mismo explicar muestra UNIQ_EMAIL_USER como posible clave, puede usted por favor vuelve a revisar?
    • voy a comprobarlo ahora mismo, gracias.
    • Ok, encontrado el truco. Cuando la restricción se define mediante user_id primero y luego email no se muestran en EXPLAIN. Es usted consciente de ello?
    • No funciona porque el correo electrónico no es una parte de la izquierda de (user_id,correo electrónico) par. Usted no puede ir hacia abajo b-árbol para encontrar tu fila utilizando sólo la parte trasera.

Dejar respuesta

Please enter your comment!
Please enter your name here