mysql demasiados índices?


82

Estoy dedicando algún tiempo a optimizar nuestra base de datos actual.

Estoy mirando índices específicamente.

Hay algunas preguntas:

  • ¿Existen demasiados índices?
  • ¿Qué acelerarán los índices?
  • ¿Qué ralentizarán los índices?
  • ¿Cuándo es una buena idea agregar un índice?
  • ¿Cuándo es una mala idea agregar un índice?
  • ¿Pros y contras de múltiples índices frente a índices de múltiples columnas?

Respuestas:


148

¿Qué acelerarán los índices?

Recuperación de datos: sentencias SELECT.

¿Qué ralentizarán los índices?

Manipulación de datos: instrucciones INSERT, UPDATE, DELETE.

¿Cuándo es una buena idea agregar un índice?

Si cree que desea obtener un mejor rendimiento en la recuperación de datos.

¿Cuándo es una mala idea agregar un índice?

En tablas que verán una gran manipulación de datos: inserción, actualización ...

¿Pros y contras de múltiples índices frente a índices de múltiples columnas?

Las consultas deben abordar el orden de las columnas cuando se trata de un índice de cobertura (un índice en más de una columna), de izquierda a derecha en la definición de columna de índice. El orden de las columnas en la declaración no importa, solo el de las columnas 1, 2 y 3; una declaración debe tener una referencia a la columna 1 antes de que se pueda usar el índice. Si solo hay una referencia a la columna 2 o 3, no se podría utilizar el índice de cobertura para 1/2/3.

En MySQL, solo se puede usar un índice por instrucción SELECT / en la consulta (las subconsultas / etc se ven como una declaración separada). Y hay un límite para la cantidad de espacio por tabla que permite MySQL. Además, ejecutar una función en una columna indexada hace que el índice sea inútil - IE:

WHERE DATE(datetime_column) = ...

11
¡Guau, esta información está realmente bien estructurada y es muy útil! Y lo más útil para mí fue que un índice en el que se aplica una función es inútil ... ¡gracias por esta respuesta!
Chris

2
@OMG, con respecto a su último párrafo, se puede usar más de un índice selectdebido a la combinación de índices. percona.com/blog/2012/12/14/…
Pacerier

1
-1 por decir (1) solo acelera "SELECCIONAR", acelera las consultas SELECCIONAR, ACTUALIZAR y ELIMINAR, siempre que los índices se creen correctamente de acuerdo con las condiciones "DÓNDE", pero requiere que los índices se actualicen sobre la manipulación de datos, lo que significa que solo las consultas INSERT van a ser más lentas (en todos los casos) que sin índices y (2) por decir que MySQL solo puede usar un índice a la vez.
Patrick Allaert

Igual que @PatrickAllaert -1 para información engañosa sobre actualización, eliminación
Eimsas

64

No estoy de acuerdo con algunas de las respuestas a esta pregunta.

¿Existen demasiados índices?

Por supuesto. No cree índices que no utilice ninguna de sus consultas. No cree índices redundantes. Utilice herramientas como pt-duplicate-key-checker y pt-index-use para ayudarlo a descubrir los índices que no necesita.

¿Qué acelerarán los índices?

  • Condiciones de búsqueda en la cláusula WHERE.
  • Condiciones de unión.
  • Algunos casos de ORDER BY.
  • Algunos casos de GROUP BY.
  • Limitaciones ÚNICAS.
  • Limitaciones FOREIGN KEY.
  • Búsqueda de texto completo.

Otras respuestas han informado que INSERT / UPDATE / DELETE son más lentos cuanto más índices tenga. Eso es cierto, pero considere que muchos usos de UPDATE y DELETE también tienen cláusulas WHERE y en MySQL, UPDATE y DELETE también son compatibles con JOIN. Los índices pueden beneficiar estas consultas más que compensar la sobrecarga de actualizar índices.

Además, InnoDB bloquea las filas afectadas por una ACTUALIZACIÓN o ELIMINACIÓN. A esto lo llaman bloqueo a nivel de fila, pero en realidad es bloqueo a nivel de índice. Si no hay un índice para limitar la búsqueda, InnoDB tiene que bloquear muchas más filas que la fila específica que está cambiando. Incluso puede bloquear todas las filas de la tabla. Estos bloqueos bloquean los cambios realizados por otros clientes, incluso si lógicamente no entran en conflicto.

¿Cuándo es una buena idea agregar un índice?

Si sabe que necesita ejecutar una consulta que se beneficiaría de un índice en uno de los casos anteriores.

¿Cuándo es una mala idea agregar un índice?

Si el índice es un prefijo izquierdo de otro índice existente, o el índice no ayuda a ninguna de las consultas que necesita ejecutar.

¿Pros y contras de múltiples índices frente a índices de múltiples columnas?

En algunos casos, MySQL puede realizar una optimización de combinación de índices y unir o intersecar los resultados de búsquedas de índices independientes. Pero ofrece un mejor rendimiento para definir un solo índice, por lo que no es necesario realizar la combinación de índices.

Para uno de mis clientes de consultoría, definí un índice de varias columnas en una tabla de muchos a muchos donde no había índice, ¡y mejoré su consulta de combinación en un factor de 94 millones!

Diseñar los índices correctos es un proceso complejo, basado en las consultas que necesita optimizar . No debe establecer reglas generales como "indexar todo" o "indexar nada para evitar ralentizar las actualizaciones".

Vea también mi presentación Cómo diseñar índices, de verdad .


10
+1 para "... considere que muchos usos de UPDATE y DELETE también tienen cláusulas WHERE y en MySQL, UPDATE y DELETE también son compatibles con JOIN. Los índices pueden beneficiar estas consultas más que compensar la sobrecarga de actualizar índices".
Rob Craig

1
Esta debería ser la respuesta aceptada por haber tenido en cuenta las cláusulas where al actualizar y eliminar.
Leonardo Emilio Dominguez

1
Esta es la respuesta correcta, la que marcó como correcta es incorrecta.
Eimsas

7

¿Existen demasiados índices?

Los índices deben estar informados por el problema en cuestión: las tablas, las consultas que ejecutará su aplicación, etc.

¿Qué acelerarán los índices?

SELECCIONA.

¿Qué ralentizarán los índices?

Los INSERTs serán más lentos porque tienes que actualizar el índice.

¿Cuándo es una buena idea agregar un índice?

Cuando su aplicación necesita otra cláusula WHERE.

¿Cuándo es una mala idea agregar un índice?

Cuando no lo necesita para consultar o aplicar restricciones de unicidad.

¿Pros y contras de múltiples índices frente a índices de varias columnas?

No entiendo la pregunta. Si tiene una restricción de unicidad que incluye varias columnas, modele como tal.


4

¿Existen demasiados índices?

Si. No salga a buscar crear índices, créelos según sea necesario.

¿Qué acelerarán los índices?

Cualquier consulta en la tabla / vista de índices.

¿Qué ralentizarán los índices?

Cualquier instrucción INSERT contra la tabla indexada se ralentizará, porque cada nuevo registro deberá indexarse.

¿Cuándo es una buena idea agregar un índice?

Cuando una consulta no se ejecuta a una velocidad aceptable. Es posible que esté filtrando registros que no forman parte del PK agrupado, en cuyo caso debe agregar índices basados ​​en los filtros que está buscando (si el rendimiento lo considera adecuado).

¿Cuándo es una mala idea agregar un índice?

Cuando lo hace por el simple hecho de hacerlo , es decir, sobre optimización.

¿Pros y contras de múltiples índices frente a índices de múltiples columnas?

Depende de las consultas que estés intentando mejorar.


3

¿Existen demasiados índices?

Sí, como todas las cosas, demasiados índices ralentizarán la manipulación de datos.

¿Cuándo es una buena idea agregar un índice?

Una buena idea para agregar un índice es cuando sus consultas son demasiado lentas (es decir, tiene demasiadas combinaciones en sus consultas). Debe usar esta optimización solo después de haber creado un modelo sólido, para ajustar el rendimiento.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.