Es importante tener en cuenta que el orden de los campos en el índice es importante.
Un índice es, en cierto sentido, un árbol de búsqueda. Si indexa (B.event, B.state), el árbol agrupará todos los registros con el campo "evento" guardado, luego los ordenará por el campo "estado".
Si fuera a consultar ese índice para "b.state = x", el índice sería de poca utilidad; El índice es ordenado por el "evento" primero.
En su ejemplo:
- Un filtro por ella es "evento" campo
- A.event unirse a B.event
- B.state unirse a C.id
- Join B.hur = D.id
- Ordenar por B.event, B.timestamp
es importante tener en cuenta que el Optimize mirar las estadísticas de las tablas, los índices y, a continuación, puede volver a organizar el orden de las uniones. El resultado será el mismo, pero el orden puede ofrecer un rendimiento diferente, y el trabajo de los optimizadores es intentar encontrar el mejor rendimiento.
En su caso, esperaría que el pedido de B.event fuera extremadamente importante. Simplemente porque ese es el orden del resultado resultante, Y es el campo por el que filtra.
Luego se une a B.state to C.id. Entonces, tener e indexar en C.id es bueno, hace que la unión sea más rápida. Pero igualmente, tener los datos de la tabla B en un buen orden también puede hacer que la unión sea más rápida.
Pero, tener un índice en B.event y un índice separado en B.state puede rendir poco. El índice B.state se vuelve inútil porque estamos usando el índice B.event. Si combina los dos en un índice (b.event luego b.state), el plan de ejecución puede encontrar una forma de utilizar la parte b.state del índice.
Finalmente, si coloca todos los campos en el índice, el índice se hace más grande, pero es posible que la consulta nunca tenga que mirar la tabla. La información está en el índice. El tiempo necesario para pasar de un índice a la tabla para encontrar los campos "faltantes" es similar al de una combinación. Por lo tanto, para el rendimiento de lectura, agregar campos adicionales al índice puede ser muy útil.
estoy WITTERING en este momento, pero el resumen es el siguiente:
- Por lo general, índice separado en campos separados no se acostumbra juntos
- Para los índices compuestos, el orden que especifique los campos hace la diferencia
- Agregar campos 'adicionales' al índice lo hace más grande, pero también puede hacer consultas más rápido
- El orden del plan de ejecución es más importante que el orden de su consulta
- Pero los índices que tiene pueden determinar el orden de el plan de ejecución
Este tipo de trabajo tiene sin respuestas categóricas Depende tanto de tus datos que está más cerca de un arte.
Una opción es sobrecargar las tablas con índices, ver el plan de ejecución resultante y eliminar los índices que no son necesarios.
Pero incluso allí se aplica una advertencia. Debido a que el plan de ejecución depende de los datos (y de las estadísticas de la tabla), es muy importante tener datos del mundo real en las tablas. Si bien las tablas tienen 10 'o 100 s de filas, un plan de ejecución puede ser el más rápido. Pero cuando obtiene millones de filas, el plan de ejecución puede cambiar, y así beneficiarse de diferentes índices.
Correcto, pero compruebe si se usará B.timestamp en realidad. – Pomyk
¿Qué tan grande es cada una de las tablas, y cuántas filas esperaría que coincidan de una consulta determinada. ¿Qué base de datos estás usando? –
Además, ¿con qué frecuencia se agregan datos a las tablas y con qué frecuencia desea ejecutar la consulta? –