Tengo una tabla MySQL que tiene, entre otros atributos, una marca de tiempo, un tipo y un user_id.
Todos ellos son buscables y/o clasificables.
¿Es mejor crear un índice para cada uno, o crear un solo índice compuesto con los tres, o ambos?MySQL: hacer un índice compuesto de 3 campos, o hacer 3 índices separados?
Respuesta
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.
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.
- 1. Índice compuesto MySQL no utilizado
- 2. 3 búferes de índice
- 3. MongoDB - índice único vs índice compuesto
- 4. Rails 3 manera de hacer skip_before_filter,: Sólo
- 5. ¿Cómo hacer 3-table Natural Join?
- 6. una clave Hibernate 3 Compuesto con GeneratedValue
- 7. ¿Cómo hacer enumeraciones en Rails 3?
- 8. Campos dinámicos con Rails 3
- 9. MySQL. Crear un índice para consultas "O"
- 10. ASP.NET MVC 3, cómo hacer temas bien
- 11. EJB 3 o Hibernate 3
- 12. rails 3 buscar o crear en base a múltiples campos
- 13. ¿Se requiere un índice compuesto para acelerar la consulta combinada?
- 14. elementos Cómo hacer un pedido incluidos en los carriles 3
- 15. Ruby on Rails 3 y cómo hacer un servicio web
- 16. actionscript 3 cómo hacer un seguimiento del tiempo transcurrido?
- 17. MySQL innerjoin 3 mesas
- 18. Rails 3 Mysql Problems
- 19. Índices de MySQL y orden
- 20. Rails 3. Condicionalmente mostrar campos con Formtastic
- 21. Rails 3 - ¿Falta de rutas de índice?
- 22. Rails 3 Índices de base de datos y otra optimización
- 23. MySQL seleccione Unir 3 Tablas
- 24. Rails 3: hacer una ruta fácil para leer y modificar
- 25. ¿Equivalente a un índice compuesto en varias tablas?
- 26. MySQL Compruebe si hay 3 o más consecutivos (específico) entradas
- 27. MySQL trunca el índice único compuesto a 64 caracteres
- 28. ¿Cómo hacer llamadas Ajax con Rails 3 usando remote_function?
- 29. ¿Cómo puedo hacer un grupo contiguo en MySQL?
- 30. ¿Cómo hacer que esto funcione en Rails 3?
... y seguirá siendo útil para consultas como 'select * from my_table where tstamp = @ ts1' – Unreason
Sí, podría ayudar a esa consulta. Pero no será tan útil como un índice ** solo ** en esa columna. –
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