2012-03-21 18 views
5

En mi mesa tengo dos columnas estrechamente relacionados A y B. ¿Qué consideraciones debo posible hechas para decidir si se debe crear:¿Debo definir el índice (A) y el índice (B), o el índice (A, B) o ambos?

  • índice (A) y el índice (B),
  • índice (A, B),
  • ambos de los anteriores?

¿Cómo este cambio si:

  1. uso sólo consultas como where A = 5 and B = 10 (y nunca como where A = 5),
  2. también utilizar consultas como where A > 3 and A < 10 and B > 12 and B < 20,
  3. a menudo utilizan order by (A, B),
  4. a menudo usa group by (A, B)?

Nota: intencionalmente no he proporcionado más detalles sobre mi caso particular, ya que quiero una respuesta general que también sirva para otros. Yo uso mysql, pero si das una respuesta más general que cubre SQL en general, sería genial.

+0

tenga en cuenta que he leído [esta pregunta] (http://stackoverflow.com/questions/2291193/mysql-difference-between-add-indexa-add-indexb-and-add-ind) pero doesn ' cubrir toda mi pregunta – TMS

+0

Use EXPLAIN tanto como pueda en sus consultas, y experimente con varias configuraciones de índice. ¡Eso debería ser bastante instructivo! – SirDarius

Respuesta

4

Ok, cuando tienes un índice (A, B), MySQL también lo puede usar como índice (A). Declarar AB y A no tiene sentido. La declaración de AB y B, sin embargo

Así que tienen estas opciones:

  1. Índice (A, B)
  2. Índice (A, B) y el índice (B)
  3. Índice (A) y el índice (B)
+1

¡Bien, gracias! ¿Pero te refieres a 3 opciones, también 'Index (A, B)' solo? – TMS

+4

Si nunca busca en la columna 'B' sin la columna' A', puede usar 'Index (A, B)' solo también. Lo que hay que recordar es que ** 'Index (A, B)' no se puede usar para buscar solo en B **. Es lógico: piense en un diccionario en el apellido, primer nombre: encontrar todas las personas con el primer nombre 'thomas' allí será difícil. – Konerak

+0

gracias Konerak. ¿Pero qué pasa con la consulta 2: 'donde A> 3 y A < 10 and B > 12 y B <20'? ¿No es un caso donde se necesita un índice separado para B? – TMS

3

Si siempre utiliza dos columnas (o el primero del índice) en su WHERE/GROUP BY/ORDER BY se debe utilizar index(A,B).

El segundo en el índice (en este caso B) no se puede usar por separado, pero el primero puede (solo el primero en cualquier caso).

De modo que si nunca usa B por sí solo, entonces index(A,B) debería ser suficiente. Si nunca usa A por sí mismo, pero sí utiliza B, haga index(B,A). Si usa ambos por separado, pero en su mayoría juntos, agregue el otro índice por separado.

+0

Gracias a Topener, pero ¿qué pasa con la consulta 2. 'donde A> 3 y A < 10 and B > 12 y B <20'? ¿No es un caso donde se necesita un índice separado para B? – TMS

+0

que es correcto @Tomas –

1

un índice en (A,B) se encargará de sus casos 1, 3 y 4.

Para el caso 2, donde tiene una consulta gama de A y también en B, lo mejor es tener un índice en (A), y una índice separado en (B), y deje que la base de datos decida cuál es la mejor para la consulta. Puede decidir sobre la marcha qué índice es más selectivo en función de los valores de la consulta. MySQL solo usará un índice en este caso, por lo que elegirá cuál cree que le dará el conjunto más pequeño de filas para el rango dado, y luego recorrerá esas filas filtrando por el otro rango.

Así que para manejar todos los casos que ha mencionado, recomiendo índices en:

  • (A,B)
  • (B)

El índice de (A,B) se puede utilizar como un índice sólo en (A) siempre que la base de datos necesite un índice en solo (A), entonces definir esos dos índices es como tener un conjunto de "todos los anteriores" de (A), (B) y (A,B).

También tenga en cuenta que si alguna vez desea ordenar por grupo o por (B, A), desea un índice en (B,A), así como (A,B). ¡El orden es importante!

Cuestiones relacionadas