2011-06-01 19 views
13

Así que tengo una pregunta.¿Índice o único? Lo que es mejor MySql

Supongamos que tiene una solicitud de tabla, que representa un gráfico. Hay 3 columnas en la tabla de solicitud, A, B, hora. A -> B En el momento. Entonces, lo que cada fila representa es una conexión dirigida de A (el solicitante) a B (el solicitante) en el Tiempo T (el tiempo es solo para organizar datos, no para nada más).

Entonces, ¿qué es más rápido si las solicitudes son 1,000,000 de filas?
Índice (A, B) Índice (A) e índice (B) Único (A, B)?

Gracias chicos! Y A, B son VARCHAR (32) (MD5)

Lo siento, olvidé una consulta típica.
Necesito poder ver si el usuario A (que inició sesión) tiene alguna solicitud.
También necesitaré buscar para verificar que un usuario haya aceptado una solicitud correcta, A Acepta B.

Así serán las declaraciones.

¿Alguna nueva solicitud?

SELECT B, time 
FROM requests 
WHERE A='$id'; 

Does A have a request from B?

SELECT time 
FROM requests 
WHERE A='$A' and B='$B'; 
+1

"Más rápido" depende de cómo planeas buscar contra los datos. ¿Cómo sería una consulta típica? –

+0

Oko, acaba de actualizar los elementos. Lo siento, olvidé poner las consultas. Probablemente estaré haciendo MUCHAS solicitudes más de NUEVAS PETICIONES que para una solicitud de B – Michael

+0

. Recomendaría poner un índice normal en A y B, le dará un buen rendimiento y la flexibilidad que necesita. No use una restricción única, los MD5 pueden colisionar, pero las probabilidades son mínimas, reducirá demasiado las cosas. El punto final MD5 ya no es seguro, 'caminar no se ejecute en un hash más seguro como SHA512'. – Johan

Respuesta

3

En este caso específico, utilice un índice compuesto que incluya A y B. Asegúrese de que A es el primero en el índice. De esta forma, cuando ejecuta estas dos consultas, el índice se usará para ambos.

Más sobre índices compuestos:

http://dev.mysql.com/doc/refman/5.5/en/multiple-column-indexes.html

Además, la singularidad (A, B) no debería importar menos que su requerimiento es que B sólo puede solicitar una como máximo vez.

+0

@AJ, no veo el caso de uso para un índice compuesto aquí, si solo quiero buscar B, estoy jodido con el índice compuesto. ¿Por favor iluminame? – Johan

+2

@Johan - lea el manual. "Si la tabla tiene un índice de columnas múltiples, el optimizador puede usar cualquier prefijo que esté más a la izquierda del índice para buscar filas. Por ejemplo, si tiene un índice de tres columnas (col1, col2, col3), ha indexado capacidades de búsqueda en (col1), (col1, col2) y (col1, col2, col3). "El OP especificó dos consultas: una que busca valores en A y otra que busca valores en A, B. Si hay una necesidad de buscar ** solo B **, el OP necesita especificar eso y revisaré mi respuesta. –

+2

@AJ Sé todo lo que odio las teclas compuestas, porque anulan tu flexibilidad, mejor para empezar con índices simples y traer claves compuestas después de que tu diseño de interfaz de usuario y de interfaz se haya estabilizado y necesites ese 5% adicional de velocidad, o cualquier minúsculo porcentaje de teclas compuestas que le den. Sin embargo, veo tu punto aquí y, técnicamente, estás en lo cierto y te revalidaría si no me desagradan tanto las llaves compuestas del infierno. – Johan

34

Índice y únicos son dos conceptos completamente diferentes.

índices
Un índice es una columna extra escondido sosteniendo los mismos datos ordenados con un puntero a los datos reales. El uso de un índice que puede

  1. encontrar rápidamente un artículo en particular
  2. rápidamente encontrar una amplia gama de artículos (entre X e Y)
  3. Ahorro de tiempo al utilizar order by porque los artículos se han clasificado previamente
  4. Guardar tiempo cuando se utiliza group by porque el grupo necesita coincidir con elementos idénticos

Este es un índice normal, no le importa dup límites de valores, a excepción de la clave primaria que siempre es única.

único (Índice)
Si se quiere evitar valores duplicados se puede poner un unique index en él.Esto hará todo lo anterior, pero agregue una verificación adicional en cada actualización e inserte para verificar si esos valores aún no se encuentran en la base de datos. Si intenta insertar una fila duplicada en una columna única, MySQL dará un error y rechazará su inserción.
(no se puede hacer una fila unique sin necesidad de utilizar un índice)

El uso de índices ralentiza las inserciones y actualizaciones abajo.
El uso de índices únicos ralentiza aún más hacia abajo. Sin embargo, los índices aceleran select mucho, mucho.
Unique no acelera nada, se asegura de que no inserte accidentalmente una fila duplicada.

Cuándo utilizar índices y cuando no
No ponga un índice en todos los campos. Como se indicó anteriormente, se ralentizará insert sy update s hacia abajo.
Siempre coloque un índice en los criterios de unión. Y considere seriamente poner un índice en la columna que usa en las cláusulas where.
MySQL rechazará usar un índice si el 50% de sus filas tienen el mismo valor en un campo, así que olvídese de los índices en campos booleanos (Y/N), el 99% de las veces no funcionarán.
(índices en los campos de baja cardinalidad no son útiles)

siempre se asigne una clave primaria
siempre asigne una clave principal en su mesa sin embargo. Preferiblemente del tipo integer autoincrement. Si usted no asigna una clave primaria, MySQL asignará una clave primaria 'oculta' (de tipo autoincrement entero), pero no puede usar el PK oculto para acelerar las cotizaciones o identificar sus filas y hay una serie de otros problemas de lentitud con PK ocultos que los hacen chupar muy mal.

Espero que esto ayude.

Enlaces:
Cómo utiliza MySQL los índices: http://dev.mysql.com/doc/refman/5.5/en/mysql-indexes.html
Al utilizar índices: http://www.howtoforge.com/when-to-use-indexes-in-mysql-databases
Más de esas cosas: http://www.databasejournal.com/features/mysql/article.php/1382791/Optimizing-MySQL-Queries-and-Indexes.htm
Finalmente se esconden aquí si quieres saber más acerca de MySQL: http://planet.mysql.com/

+0

Excelente respuesta por cierto, solo estaba revisando una de estas viejas preguntas. ¡Esta es la respuesta más informativa! :) – Michael

+0

excelente respuesta, gracias por la sugerencia de la clave principal oculta – wolfgang

Cuestiones relacionadas