2011-01-23 8 views
14

estoy tratando de entender lo que es mejor cuando se definen los índices de varias columnas: (? Cardinalidad superior, para la velocidad)orden de las columnas en un índice de varias columnas en MySQL

  • Poner la columna más selectiva primera ; o
  • Poner la columna menos selectivos primero (cardinalidad inferior, por compresión de índice?)

O tal vez depende si estoy optimizar para la velocidad o el espacio?

+0

Su orden de índice se define por las consultas a las que está destinado el índice. Una vez que define los índices por las consultas, NO tiene opción en qué orden aparecen sin que el índice sea inutilizable para algunas de las consultas. –

+0

Una vez más, entiendo eso, pero entre las dos opciones que sirven las consultas, ¿cuál es mejor, tomando la gran diferencia en cardinalidad? – sbargay

+1

@sbargay ¿Alguna vez descubrió la respuesta a esta pregunta? Sé lo que estás preguntando. Si tiene country_id y person_id, ¿es mejor configurar el índice country_id, person_id, o es mejor establecer primero la cardinalidad más alta con person_id, country_id? Parece que obviamente sabes cómo usar los índices correctamente en tus consultas, pero tuve la misma pregunta que tú. – n0nag0n

Respuesta

3

Siempre coloque la columna más selectiva al principio, muy raramente hay una razón para el revés.

o tal vez depende de si estoy optimizando la velocidad o el espacio?

Déjenme decirlo de esta manera. ¿Cuál es el punto de usar menos almacenamiento, si causa el índice not to be used at all? Un índice de cardinalidad bajo (yendo en orden de columnas) normalmente no se usará si no es un índice de cobertura para la consulta, porque será terriblemente caro volver a los datos de otras columnas.

El objetivo de los índices es ayudar a la consulta y tenerlos en el orden correcto (cardinalidad) siempre debe ser la consideración más importante.

+2

Ok, digo que guardo el ID de país (cardinalidad baja) y el ID de persona (cardinalidad alta). la misma identificación de persona puede existir en varios países. ¿Debo poner country_id, person_id o viceversa? A veces necesito recuperar a todas las personas de un país, y algunas veces alcanzo a todas las personas con la misma persona_id – sbargay

9

El orden de las columnas debe coincidir con el orden en que las columnas se consultan más tarde o MySQL no las usará. Esta es la pregunta que realmente debería pensar.

Más información here.

ACTUALIZACIÓN:

Para su pregunta sobre cardinalidad tal vez leer this. ¿Es esto similar a su pregunta? ¿Lo responde?

+0

Me encargo de la secuencia (la mayoría se puede usar para consultas de columnas individuales, etc.), pero aun así, tengo la flexibilidad de decidir quien es el primero y quien es el segundo Estoy buscando una pista para seleccionar que va donde. – sbargay

+0

¿Has leído el enlace? O no entiendo la pregunta o la respuesta está dada y es "en el orden en que suelen ser consultados". – FabianB

+0

Sí, lo leí: p. índice en columnas a = cardinalidad = 23, b = cardinalidad = 1000000, c = cardinalidad = 500000. Mis consultas siempre necesitan las columnas a, bo a, b, c. – sbargay

Cuestiones relacionadas