sql >> Base de Datos >  >> RDS >> Mysql

Índices de MySQL:¿cuáles son las mejores prácticas?

Definitivamente, debería pasar algún tiempo leyendo sobre la indexación, hay mucho escrito al respecto y es importante entender lo que está pasando.

En términos generales, un índice impone un orden en las filas de una tabla.

En aras de la simplicidad, imagine que una tabla es solo un gran archivo CSV. Cada vez que se inserta una fila, se inserta al final . Entonces, el orden "natural" de la tabla es solo el orden en que se insertaron las filas.

Imagine que tiene ese archivo CSV cargado en una aplicación de hoja de cálculo muy rudimentaria. Todo lo que hace esta hoja de cálculo es mostrar los datos y numerar las filas en orden secuencial.

Ahora imagine que necesita encontrar todas las filas que tienen algún valor "M" en la tercera columna. Dado lo que tienes disponible, solo tienes una opción. Escanea la tabla comprobando el valor de la tercera columna para cada fila. Si tiene muchas filas, este método (una "exploración de tabla") puede llevar mucho tiempo.

Ahora imagine que, además de esta tabla, tiene un índice. Este índice particular es el índice de valores en la tercera columna. El índice enumera todos los valores de la tercera columna, en un orden significativo (digamos, alfabéticamente) y para cada uno de ellos, proporciona una lista de números de fila donde aparece ese valor.

Ahora tiene una buena estrategia para encontrar todas las filas donde el valor de la tercera columna es "M". Por ejemplo, puede realizar una búsqueda binaria ! Mientras que el escaneo de la tabla requiere que busque N filas (donde N es el número de filas), la búsqueda binaria solo requiere que mire las entradas del índice log-n, en el peor de los casos. ¡Guau, seguro que es mucho más fácil!

Por supuesto, si tiene este índice y está agregando filas a la tabla (al final, ya que así es como funciona nuestra tabla conceptual), debe actualizar el índice cada vez. Por lo tanto, hace un poco más de trabajo mientras escribe nuevas filas, pero ahorra mucho tiempo cuando busca algo.

Entonces, en general, la indexación crea una compensación entre la eficiencia de lectura y la eficiencia de escritura. Sin índices, las inserciones pueden ser muy rápidas:el motor de la base de datos simplemente agrega una fila a la tabla. A medida que agrega índices, el motor debe actualizar cada índice mientras realiza la inserción.

Por otro lado, las lecturas se vuelven mucho más rápidas.

Esperemos que eso cubra sus dos primeras preguntas (como otros han respondido:debe encontrar el equilibrio correcto).

Su tercer escenario es un poco más complicado. Si está utilizando LIKE, los motores de indexación generalmente lo ayudarán con su velocidad de lectura hasta el primer "%". En otras palabras, si está SELECCIONANDO DONDE la columna COMO 'foo%bar%', la base de datos usará el índice para encontrar todas las filas donde la columna comienza con "foo", y luego necesitará escanear ese conjunto de filas intermedio para encontrar el subconjunto que contiene "barra". SELECCIONE... DONDE la columna LIKE '%bar%' no puede usar el índice. Espero que puedas ver por qué.

Finalmente, debe comenzar a pensar en índices en más de una columna. El concepto es el mismo y se comporta de manera similar a LIKE:esencialmente, si tiene un índice en (a, b, c), el motor continuará usando el índice de izquierda a derecha lo mejor que pueda. Entonces, una búsqueda en la columna a podría usar el índice (a,b,c), como lo haría una en (a,b). Sin embargo, el motor necesitaría hacer una exploración completa de la tabla si estuviera buscando DONDE b=5 Y c=1)

Espero que esto ayude a arrojar un poco de luz, pero debo reiterar que es mejor que pases unas horas buscando buenos artículos que expliquen estas cosas en profundidad. También es una buena idea leer la documentación de su servidor de base de datos en particular. La forma en que los planificadores de consultas implementan y utilizan los índices puede variar bastante.