2010-11-16 11 views

Respuesta

8

La respuesta de Pablo es correcta, pero tal vez no se dé cuenta de que un índice compuesto podría estar justificado.

Puede tener varios í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 de usted 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 tales consultas, puede considerar agregar un índice compuesto.

La desventaja de los índices es que ralentiza todas las operaciones de actualización. Sin embargo, la mayoría de las aplicaciones generales hacen muchas más selecciones y actualizaciones (tanto en términos de transacciones, es decir, número de declaraciones y especialmente en términos de registros afectados/recuperados) y al mismo tiempo son mucho más tolerantes con las actualizaciones más lentas (los usuarios mayormente juzgan la velocidad de el sistema no es cuando es necesario actualizar un registro, sino por el tiempo necesario para recuperar los registros, de nuevo YMMV y hay aplicaciones que no cumplen con dichas reglas).

Lo mejor sería si tuviera alguna manera de probar el rendimiento de la base de datos en términos de cargas de trabajo típicas (crear algunos scripts SQL típicos, independientes y repetibles, o crear pruebas unitarias en el nivel de aplicación) y luego puede ajustar objetivamente su base de datos.

EDIT También tenga en cuenta que los índices se pueden agregar y soltar sin afectar el sistema en términos de funcionalidad. Por lo tanto, puede ajustar sus índices más tarde, durante el uso real del sistema, y ​​normalmente debería recopilar y perfilar las consultas SQL lentas en busca de condiciones que podrían beneficiarse al agregar índices.

7

Si va a realizar búsquedas en esos campos por separado, es probable que necesite índices separados para hacer que sus consultas se ejecuten 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'; 

Entonces my_idx no será de mucha ayuda para su búsqueda y MySQL va a terminar haciendo un total escaneo de tabla para resolverlo.

+0

... y seguirá siendo útil para consultas como 'select * from my_table where tstamp = @ ts1' – Unreason

+0

Sí, podría ayudar a esa consulta. Pero no será tan útil como un índice ** solo ** en esa columna. –

+3

sí, en realidad será tan útil como el índice solo en esa columna. Puede ser más lento debido al hecho de que el índice es más grande; sin embargo, si el índice en una sola columna sería útil (es decir,alta selectividad), entonces el índice compuesto será tan útil: mysql podría mirar a través de un índice más grande, pero los índices btree están organizados como árboles, así que aumente de tamaño, combinado con el hecho de que solo se necesita visitar una parte del árbol, combinado con El hecho de que las operaciones de E/S ocurran en tamaños de bloque, se traduce en: los índices con la misma columna de inicio son igualmente útiles para las condiciones en esa columna. – Unreason