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

Comprender los índices en MySQL:tercera parte

Esta publicación de blog es la tercera parte de una serie de blogs sobre índices en MySQL . En la segunda parte de la serie de publicaciones de blog sobre índices de MySQL , cubrimos los índices y los motores de almacenamiento y mencionamos algunas consideraciones PRIMARIAMENTE CLAVE. La discusión incluyó cómo hacer coincidir un prefijo de columna, algunas consideraciones de índice FULLTEXT y cómo debe usar índices B-Tree con comodines y cómo usar ClusterControl para monitorear el rendimiento de sus consultas, posteriormente, índices.

 

En esta publicación de blog, entraremos en más detalles sobre los índices en MySQL :cubriremos los índices hash, la cardinalidad del índice, la selectividad del índice, le brindaremos detalles interesantes sobre cómo cubrir los índices y también analizaremos algunas estrategias de indexación. Y, por supuesto, hablaremos de ClusterControl. Comencemos, ¿de acuerdo?

Índices hash en MySQL

Los DBA de MySQL y los desarrolladores que trabajan con MySQL también tienen otro truco bajo la manga en lo que respecta a MySQL:los índices hash también son una opción. Los índices hash se usan con frecuencia en el motor MEMORY de MySQL; como casi todo en MySQL, ese tipo de índices tienen sus ventajas y desventajas. La principal desventaja de este tipo de índices es que se usan solo para comparaciones de igualdad que usan los operadores =o <=>, lo que significa que no son realmente útiles si desea buscar un rango de valores, pero la ventaja principal es que las búsquedas son muy rápidas. Un par de desventajas más incluyen el hecho de que los desarrolladores no pueden usar ningún prefijo más a la izquierda de la clave para encontrar filas (si quiere hacer eso, use los índices B-Tree en su lugar), el hecho de que MySQL no puede determinar aproximadamente cuántas filas hay entre dos valores:si se utilizan índices hash, el optimizador tampoco puede utilizar un índice hash para acelerar las operaciones ORDER BY. Tenga en cuenta que los índices hash no son lo único que admite el motor MEMORY:los motores MEMORY también pueden tener índices B-Tree.

Index Cardinalidad en MySQL

En lo que respecta a los índices de MySQL, es posible que también haya escuchado otro término:este término se llama cardinalidad de índice. En términos muy simples, la cardinalidad del índice se refiere a la unicidad de los valores almacenados en una columna que usa un índice. Para ver la cardinalidad del índice de un índice específico, simplemente puede ir a la pestaña Estructura de phpMyAdmin y observar la información allí o también puede ejecutar una consulta MOSTRAR ÍNDICES:

mysql> SHOW INDEXES FROM demo_table;
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table         | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| demo_table |          1 | demo     |            1 | demo        | A         |      494573 |     NULL | NULL   |      | BTREE      |         |               |
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)

El resultado de la consulta SHOW INDEXES que se puede ver arriba tiene muchos campos, uno de los cuales representa la cardinalidad del índice:este campo devuelve un número estimado de valores únicos en el índice:el cuanto mayor sea la cardinalidad, mayor será la posibilidad de que el optimizador de consultas utilice el índice para las búsquedas. Dicho esto, la cardinalidad de índice también tiene un hermano:su nombre es selectividad de índice.

Selectividad de índices en MySQL

La selectividad de un índice es el número de valores distintos en relación con el número de registros en la tabla. En términos simples, la selectividad del índice define cuán estrechamente un índice de base de datos ayuda a MySQL a reducir la búsqueda de valores. Una selectividad de índice ideal es el valor de 1. Una selectividad de índice se calcula dividiendo los valores distintos en una tabla por el número total de registros, por ejemplo, si tiene 1,000,000 registros en su tabla, pero solo 100,000 de ellos son valores distintos , la selectividad de su índice sería 0.1. Si tiene 10 000 registros en su tabla y 8500 de ellos son valores distintos, la selectividad de su índice sería 0,85. Eso está mucho mejor. Tú entiendes. Cuanto mayor sea la selectividad de su índice, mejor.

Índices de cobertura en MySQL

Un índice de cobertura es un tipo especial de índice en InnoDB. Cuando se utiliza un índice de cobertura, todos los campos obligatorios para una consulta están incluidos o "cubiertos" por el índice, lo que significa que también puede obtener los beneficios de leer solo el índice en lugar de los datos. Si nada más ayuda, un índice de cobertura podría ser su boleto para mejorar el rendimiento. Algunos de los beneficios de usar índices de cobertura incluyen:

  • Uno de los principales escenarios en los que un índice de cobertura podría ser útil incluye atender consultas sin lecturas de E/S adicionales en mesas grandes.

  • MySQL también puede acceder a menos datos debido al hecho de que las entradas del índice son más pequeñas que el tamaño de las filas.

  • La mayoría de los motores de almacenamiento almacenan en caché los índices mejor que los datos.

Crear índices de cobertura en una tabla es bastante simple:simplemente cubra los campos a los que se accede mediante las cláusulas SELECT, WHERE y GROUP BY:

ALTER TABLE demo_table ADD INDEX index_name(column_1, column_2, column_3);

Tenga en cuenta que cuando se trata de cubrir índices, es muy importante elegir el orden correcto de las columnas en el índice. Para que sus índices de cobertura sean efectivos, coloque las columnas que usa con las cláusulas WHERE primero, ORDER BY y GROUP BY después y las columnas usadas con la cláusula SELECT al final.

Estrategias de indexación en MySQL

Seguir los consejos cubiertos en estas tres partes de las publicaciones de blog sobre índices en MySQL puede proporcionarle una muy buena base, pero también hay un par de estrategias de indexación que puede usar si lo desea. realmente aproveche el poder de los índices en su arquitectura MySQL. Para que sus índices se adhieran a las mejores prácticas de MySQL, considere:

  1. Aislar la columna en la que usa el índice; en general, MySQL no usa índices si las columnas se utilizan en no están aislados. Por ejemplo, una consulta de este tipo no usaría un índice porque no está aislada:

    SELECT demo_column FROM demo_table WHERE demo_id + 1 = 10;


    Sin embargo, tal consulta:
     

    SELECT demo_column FROM demo_table WHERE demo_id = 10;

  2. No utilice índices en las columnas que indexa. Por ejemplo, utilizar una consulta como esa no sería muy útil, por lo que es mejor evitar este tipo de consultas si puede:
     

    SELECT demo_column FROM demo_table WHERE TO_DAYS(CURRENT_DATE) - TO_DAYS(column_date) <= 10;

  3. Si usa consultas LIKE junto con columnas indexadas, evite colocar el comodín al comienzo de la consulta de búsqueda porque de esa manera MySQL tampoco usará un índice. Eso es en lugar de escribir consultas como esta:

    SELECT * FROM demo_table WHERE demo_column LIKE ‘%search query%’;


    Considere escribirlos así:

    SELECT * FROM demo_table WHERE demo_column LIKE ‘search_query%’;


    La segunda consulta es mejor porque MySQL sabe con qué comienza la columna y puede usar índices de manera más eficaz. Sin embargo, como con todo, la instrucción EXPLAIN puede ser de gran ayuda si desea asegurarse de que MySQL realmente utilice sus índices.

Uso de ClusterControl para mantener el rendimiento de sus consultas

Si desea mejorar el rendimiento de MySQL, los consejos anteriores lo ubicarán en el camino correcto. Sin embargo, si siente que necesita algo más, considere ClusterControl para MySQL. Una de las cosas con las que ClusterControl puede ayudarlo incluye la gestión del rendimiento, como ya se señaló en publicaciones de blog anteriores, ClusterControl también puede ayudarlo a mantener sus consultas funcionando al máximo de su capacidad todo el tiempo, eso es porque ClusterControl también incluye una consulta monitor que le permite controlar el rendimiento de sus consultas, ver consultas lentas y de ejecución prolongada y también consultar valores atípicos que le alertan sobre posibles cuellos de botella en el rendimiento de su base de datos antes de que pueda detectarlos usted mismo:

Incluso puede filtrar sus consultas permitiéndole hacer una suposición si un índice fue utilizado por una consulta individual o no:

ClusterControl puede ser una gran herramienta para mejorar el rendimiento de su base de datos mientras le quita las molestias de mantenimiento. Para obtener más información sobre lo que ClusterControl puede hacer para mejorar el rendimiento de sus instancias de MySQL, considere echar un vistazo a la página de ClusterControl para MySQL.

Resumen

Como probablemente ya sepa, los índices en MySQL son una bestia muy compleja. Para elegir el mejor índice para su instancia de MySQL, sepa qué son los índices y qué hacen, conozca los tipos de índices de MySQL, conozca sus ventajas y desventajas, infórmese sobre cómo interactúan los índices de MySQL con los motores de almacenamiento, también eche un vistazo a ClusterControl para MySQL si cree que la automatización de ciertas tareas relacionadas con los índices en MySQL podría facilitarle el día.