Pregunta

Tengo una tabla de MySQL que tiene, entre otros atributos, una marca de tiempo, un tipo y un user_id.
Todos ellos se pueden buscar y / o puede ordenar.
¿Es mejor para crear un índice para cada uno, o crear un único índice compuesto con los tres, o ambos?

¿Fue útil?

Solución

La respuesta de Pablo es correcta, pero quizá no se dan cuenta de que un índice compuesto podría ser justificada.

Puede tener múltiples índices y tener idx1(tstamp, user_id) no le excluye de tener indx2(tstamp, type) o idx1reverse(user_id, tstamp) y así sucesivamente ...

Los índices compuestos son más útiles cuando cubren todas las condiciones de la consulta, por lo que el índice que se propone será más útil para

SELECT * FROM my_table WHERE tstamp = @ts1 AND user_id = @uid AND type = @type

Si desea mejorar el rendimiento de este tipo de consultas se puede considerar la adición de un índice compuesto.

La desventaja de los índices es que ralentiza todas las operaciones de actualización. Sin embargo, las aplicaciones más generales hacen muchos más selecciona a continuación las actualizaciones (tanto en las transacciones términos, es decir, número de declaraciones y sobre todo en términos de de registros afectados / recuperado) y al mismo tiempo son mucho más tolerantes de cambios lentos (los usuarios sobre todo a juzgar la velocidad de el sistema no por el tiempo que es necesario actualizar un registro, sino por el tiempo necesario para recuperar los registros;. de nuevo tu caso es distinto y hay aplicaciones que no juegan por tales normas)

Lo mejor sería si tuviera alguna manera de probar el rendimiento de base de datos en función de las cargas de trabajo típicas (crear algunos scripts SQL típica; independiente y repetible, o crear pruebas unitarias a nivel de aplicación) y luego se puede objetivamente sintonizar su base de datos .

Editar También se dan cuenta que los índices se pueden añadir y cayeron sin afectar el sistema en términos de funcionalidad. Por lo tanto, se puede sintonizar sus índices más tarde, durante el uso real del sistema -. Y normalmente le recopilar y el perfil de las consultas SQL lentos en busca de condiciones que podrían beneficiarse de la adición de índices

Otros consejos

Si va a realizar búsquedas en los campos por separado, es probable que necesite índices separados para hacer sus consultas se ejecutan más rápido.

Si usted tiene un índice de esta manera:

mysql> create index my_idx on my_table(tstamp, user_id, type);

Y usted consulta es:

mysql> select * from my_table where type = 'A';

A continuación, my_idx no será tan útiles para su búsqueda y MySQL va a terminar haciendo un escaneo completo de tabla para resolverlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top