sql >> Base de Datos >  >> RDS >> MariaDB

Comprender los índices en MySQL:primera parte

Los índices en MySQL son una bestia muy compleja. Hemos cubierto los índices de MySQL en el pasado, pero nunca nos hemos sumergido más profundamente en ellos; lo haremos en esta serie de publicaciones de blog. Esta publicación de blog debería actuar como una guía muy general para los índices, mientras que las otras partes de esta serie profundizarán un poco más en estos temas.

¿Qué son los índices?

En general, como ya se señaló en una publicación de blog anterior sobre índices, un índice es una lista alfabética de registros con referencias a las páginas en las que se mencionan. En MySQL, un índice es una estructura de datos que se usa más comúnmente para encontrar filas rápidamente. Es posible que también escuche el término "claves", que también se refiere a los índices.

¿Qué hacen los índices?

En MySQL, los índices se utilizan para encontrar rápidamente filas con valores de columna específicos y para evitar leer toda la tabla para encontrar filas relevantes para la consulta. Los índices se utilizan principalmente cuando los datos almacenados en un sistema de base de datos (por ejemplo, MySQL) aumentan de tamaño porque cuanto más grande es la tabla, mayor es la probabilidad de que pueda beneficiarse de los índices.

Tipos de índice MySQL

En lo que respecta a MySQL, es posible que haya oído hablar de que tiene varios tipos de índices:

  • UN ÍNDICE B-Tree:dicho índice se usa con frecuencia para acelerar las consultas SELECT que coinciden con una cláusula WHERE. Tal índice se puede usar en campos donde los valores no necesitan ser únicos, también acepta valores NULL.

  • UN ÍNDICE DE TEXTO COMPLETO:dicho índice se utiliza para utilizar capacidades de búsqueda de texto completo. Este tipo de índice busca palabras clave en el texto en lugar de comparar directamente los valores con los valores del índice.

  • UN ÍNDICE ÚNICO se utiliza con frecuencia para eliminar valores duplicados de una tabla. Refuerza la unicidad de los valores de fila.

  • UNA CLAVE PRINCIPAL también es un índice; se usa con frecuencia junto con campos que tienen un atributo AUTO_INCREMENTO. Este tipo de índice no acepta valores NULOS y, una vez establecidos, los valores de la columna que tiene una CLAVE PRIMARIA no se pueden cambiar.

  • UN ÍNDICE DESCENDENTE es un índice que almacena filas en orden descendente. Este tipo de índice se introdujo en MySQL 8.0:MySQL utilizará este tipo de índice cuando la consulta solicite un orden descendente.

Elección de tipos de datos óptimos para índices en MySQL

En lo que respecta a los índices, también es necesario tener en cuenta que MySQL admite una amplia variedad de tipos de datos y algunos tipos de datos no se pueden usar junto con ciertos tipos de índices (por ejemplo, FULLTEXT los índices solo se pueden usar en columnas basadas en texto (CHAR, VARCHAR o TEXT); no se pueden usar en ningún otro tipo de datos), así que antes de elegir los índices para el diseño de su base de datos, decida el tipo de datos que va a usar en la columna en cuestión (decida qué tipo de clase de datos va a almacenar:¿va a almacenar números? ¿Valores de cadena? ¿Números y valores de cadena? etc.), luego decida el rango de valores que va a almacenar (elija el que no crea que excederá porque aumentar el rango del tipo de datos puede ser una tarea que consuma mucho tiempo más adelante; le recomendamos que opte por usar un tipo de datos simple), y si no tiene la intención de usar NULL valores en sus columnas, especifique sus campos como NO NULL siempre que pueda, cuando un co anulable lumn está indexado, requiere un byte adicional por entrada.

Elección de juegos de caracteres y intercalaciones óptimos para índices en MySQL

Además de los tipos de datos, también tenga en cuenta que cada carácter en MySQL ocupa espacio. Por ejemplo, los caracteres UTF-8 pueden ocupar entre 1 y 4 bytes cada uno, por lo que es posible que desee evitar la indexación, por ejemplo, de 255 caracteres y solo use, digamos, 50 o 100 caracteres para una determinada columna.

Los beneficios y desventajas de usar índices en MySQL

El principal beneficio de usar índices en MySQL es el mayor rendimiento de las consultas de búsqueda que coinciden con una cláusula WHERE:los índices aceleran las consultas SELECT que coinciden con una cláusula WHERE porque MySQL no lee toda la tabla para encontrar filas relevante para la consulta. Sin embargo, tenga en cuenta que los índices tienen sus propios inconvenientes. Los principales son los siguientes:

  • Los índices consumen espacio en disco.

  • Los índices degradan el rendimiento de las consultas INSERTAR, ACTUALIZAR y ELIMINAR:cuando se actualizan los datos, el índice debe ser actualizado junto con él.

  • MySQL no lo protege del uso de múltiples tipos de índices al mismo tiempo. En otras palabras, puede usar una CLAVE PRINCIPAL, un ÍNDICE y un ÍNDICE ÚNICO en la misma columna; MySQL no lo protege de cometer ese error.

Si sospecha que algunas de sus consultas se están volviendo más lentas, considere echar un vistazo a la pestaña Monitor de consultas de ClusterControl; al habilitar el monitor de consultas, puede ver cuándo se vio por última vez una determinada consulta y su valor máximo. y el tiempo de ejecución promedio que puede ayudarlo a elegir los mejores índices para su tabla.

¿Cómo elegir el mejor índice para usar?

Para elegir el mejor índice para usar, puede usar los mecanismos integrados de MySQL. Por ejemplo, puede utilizar el explicador de consultas:la consulta EXPLAIN. Explicará qué tabla se usa, si tiene particiones o no, qué índices se pueden usar y qué clave (índice) se usa. También devolverá la longitud del índice y la cantidad de filas que devuelve su consulta:

mysql> EXPLAIN SELECT * FROM demo_table WHERE demo_field = ‘demo’\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: demo_table
   partitions: NULL
         type: ref
possible_keys: demo_field
          key: demo_field
      key_len: 1022
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

En este caso, tenga en cuenta que los índices se usan con frecuencia para ayudar a MySQL a recuperar datos de manera eficiente cuando los conjuntos de datos son más grandes de lo normal. Si su tabla es pequeña, es posible que no necesite usar índices, pero si ve que sus tablas son cada vez más grandes, es probable que se beneficie de un índice.

Sin embargo, para elegir el mejor índice para usar en su escenario específico, tenga en cuenta que los índices también pueden ser una de las principales causas de problemas de rendimiento. Tenga en cuenta que MySQL utilizará o no los índices de manera efectiva depende de un par de factores que incluyen el diseño de sus consultas, los índices en uso, los tipos de índices en uso, también la carga de su base de datos en el momento en que se ejecuta la consulta y otras cosas. Aquí hay un par de cosas a considerar al usar índices en MySQL:

  • ¿Cuántos datos tiene? ¿Quizás algo de eso es redundante?

  • ¿Qué consultas utiliza? ¿Sus consultas utilizarían cláusulas LIKE? ¿Qué pasa con el pedido?

  • ¿Qué tipo de índice necesitaría usar para mejorar el rendimiento de sus consultas?

  • ¿Sus índices serían grandes o pequeños? ¿Necesitaría usar un índice en un prefijo de la columna para reducir su tamaño?

Vale la pena señalar que probablemente debería evitar usar múltiples tipos de índices (por ejemplo, un índice B-Tree, un ÍNDICE ÚNICO y una CLAVE PRINCIPAL) también en la misma columna.

Mejora del rendimiento de las consultas con índices

Para mejorar el rendimiento de las consultas con índices, debe echar un vistazo a sus consultas; la declaración EXPLAIN puede ayudar con eso. En general, aquí hay un par de cosas que debe considerar si desea que sus índices mejoren el rendimiento de sus consultas:

  • Solamente pregunte a la base de datos por lo que necesita. En la mayoría de los casos, usar la columna SELECCIONAR será más rápido que usar SELECCIONAR * (ese es el caso sin usar índices también)

  • Un índice de árbol B podría ser adecuado si busca valores exactos (por ejemplo, SELECCIONE * DE tabla_demostración DONDE some_field ='x') o si desea buscar valores usando comodines (por ejemplo, SELECT * FROM demo_table WHERE some_field LIKE 'demo%' - en este caso, tenga en cuenta que usar consultas LIKE con cualquier cosa al principio podría funcionar más daño que bien:evite usar consultas LIKE con un signo de porcentaje delante del texto que está buscando; de esa manera, MySQL podría no usar un índice porque no sabe con qué comienza el valor de la fila), aunque tenga en cuenta que un índice de árbol B también se puede usar para comparaciones de columnas en expresiones que usan igual (=), mayor que (>), mayor o igual que (>=), menor que (<), menor que o igual a (<=) o ENTRE operadores.

  • Un índice de TEXTO COMPLETO podría ser adecuado si se encuentra usando texto completo (COINCIDIR... CONTRA( )) consultas de búsqueda o si su base de datos está diseñada de tal manera que solo usa columnas basadas en texto:los índices FULLTEXT pueden usar columnas TEXT, CHAR o VARCHAR, no se pueden usar en ningún otro tipo de columnas.

  • Un índice de cobertura podría ser útil si desea ejecutar consultas sin lecturas de E/S adicionales en tablas grandes . Para crear un índice de cobertura, cubra las cláusulas WHERE, GROUP BY y SELECT utilizadas por la consulta.

Examinaremos más a fondo los tipos de índices en las próximas partes de esta serie de blogs, pero en general, si usa consultas como SELECT * FROM demo_table WHERE some_field ='x' a B-tree INDEX podría encajar, si usa consultas MATCH() AGAINST(), probablemente debería buscar en un índice FULLTEXT, si su tabla tiene valores de fila muy largos, probablemente debería considerar indexar una parte de la columna.

¿Cuántos índices debería tener?

Si alguna vez usó índices para mejorar el rendimiento de sus consultas SELECT, probablemente se haya hecho una pregunta:¿cuántos índices debería tener realmente? Para entender esto, debe tener en cuenta lo siguiente:

  1. Los índices suelen ser los más efectivos con grandes cantidades de datos.

  2. MySQL usa solo un índice por cada declaración SELECT en una consulta (las subconsultas se ven como declaraciones separadas) - use la consulta EXPLAIN para averiguar qué índices son los más efectivos para las consultas que utiliza.

  3. Los índices deben hacer que todas sus declaraciones SELECT sean lo suficientemente rápidas sin comprometer demasiado el espacio en disco:"lo suficientemente rápido" , sin embargo, es relativo, por lo que deberá experimentar.

Índices y motores de almacenamiento

Cuando trabaje con índices en MySQL, también tenga en cuenta que puede haber algunos tipos de limitaciones si usa varios motores (por ejemplo, si usa MyISAM en lugar de InnoDB). Entraremos en más detalles en un blog aparte, pero aquí hay algunas ideas:

  • El número máximo de índices por tablas MyISAM e InnoDB es 64, el número máximo de columnas por índice en ambos motores de almacenamiento es 16.

  • La longitud máxima de la clave para InnoDB es de 3500 bytes; la longitud máxima de la clave para MyISAM es de 1000 bytes.

  • Los índices de texto completo tienen limitaciones en ciertos motores de almacenamiento; por ejemplo, los índices de texto completo de InnoDB tienen 36 palabras vacías, MyISAM La lista de palabras vacías es un poco más grande con 143 palabras vacías. InnoDB deriva estas palabras vacías de la variable innodb_ft_server_stopword_table mientras que MyISAM deriva estas palabras vacías del archivo storage/myisam/ft_static.c; todas las palabras que se encuentran en el archivo se tratarán como palabras vacías.

  • MyISAM era el único motor de almacenamiento con soporte para opciones de búsqueda de texto completo hasta MySQL 5.6 (MySQL 5.6. 4 para ser exactos), lo que significa que InnoDB admite índices de texto completo desde MySQL 5.6.4. Cuando se utiliza un índice FULLTEXT, busca palabras clave en el texto en lugar de comparar valores directamente con los valores del índice.

  • Los índices juegan un papel muy importante para InnoDB:InnoDB bloquea las filas cuando accede a ellas, por lo que se reduce el número de filas Los accesos de InnoDB pueden reducir los bloqueos.

  • MySQL le permite usar índices duplicados en la misma columna.

  • Ciertos motores de almacenamiento tienen ciertos tipos de índices predeterminados (por ejemplo, para el motor de almacenamiento MEMORY, el tipo de índice predeterminado es hash )

Resumen

En esta parte sobre índices en MySQL, hemos repasado algunos aspectos generales relacionados con los índices en este sistema de administración de bases de datos relacionales. En las próximas publicaciones del blog, analizaremos algunos escenarios más detallados sobre el uso de índices en MySQL, incluido el uso de índices en ciertos motores de almacenamiento, etc. También explicaremos cómo se puede usar ClusterControl para lograr sus objetivos de rendimiento en MySQL.