UT6-Optimización de Consultas MySQL GBD
UT6-Optimización de Consultas MySQL GBD
UT6-Optimización de Consultas MySQL GBD
consultas
SISTEMAS GESTORES DE BASES DE DATOS
Introducción
Ante problemas de rendimiento del servidor es necesario:
◦ Identificar el/los problemas.
◦ Intentar solucionarlos.
◦ Es posible crear índices parciales en campos muy grandes especificando el número de caracteres del
campo que se indexarán.
Índices
Creación de índices - Sintaxis
Indicando:
◦ Tipo de índice entre UNIQUE, FULLTEXT o SPATIAL (VER
SIGUIENTE
◦ Index_name: Nombre del índice
◦ Index_type: btree/hash
◦ Dependiendo del motor de almacenamiento pueden no estar
disponibles los dos tipos
◦ InnoDB solo btree
◦ Index_col_name: Nombre de la columna sobre la que
se crea el índice, longitud y orden de almacenamiento
Tipos de índices en MySQL
UNIQUE
PRIMARY
FULLTEXT
◦ Utilizados para la búsqueda de caracteres dentro de campos de texto
◦ Solo para tablas de tipo MyISAM
◦ En campos de tipo CHAR, VARCHAR y TEXT
◦ Se busca mediante el comando MATCH (col1, col2, ….) AGAINST (expresión)
SPATIAL
◦ Índices usados para datos de tipo espacial como LINE o CURVE
Estructura de índices btree vs hash
Índice btree
◦ Muy rápido a la hora de buscar valores
◦ Especialmente recomendados para consultas basadas en rangos de datos.
◦ P.e: BETWEEEN, >, <, ….
Estructura de índices btree vs hash
Índice HASH
◦ Basados en una función que mapea la clave y asigna a
cada registro una posición en el disco.
◦ Esa posición deberá ser menor que el máximo de espacio
de almacenamiento.
◦ Más rápido que btree
◦ Posibilidad de colisiones
◦ Dos registros de origen reciben la asignación del mismo hueco en disco.
◦ Lento para consultas de rangos de valores.
Ver un índice
Comando SHOW INDEX
◦ Solo interesa que sean cacheadas las consultas que se repiten con frecuencia
Optimización de consultas
Es fundamental crear índices sobre los campos más consultados o utilizados en las consultas
Las consultas que funcionan solamente sobre índices son mucho más rápidas
Para optimizar las consultas podemos usar el comando EXPLAIN
◦ Nos muestra información sobre cómo se realizará una consulta
◦ Usada de la manera más simple (Sin incoporar una select) es similar al comando DESC
Optimización de consultas
Comando EXPLAIN
Optimización de consultas
Comando EXPLAIN
◦ Id. Identificador de tabla en la consulta
◦ Select_type. (SIMPLE/UNION/DEPENDANT UNION/UNION RESULT/SUBQUERY….)
◦ Table. Nombre de la tabla de la que se sacan los registros.
◦ Type. Tipo de valores que se usan en la consulta, por ejemplo index para índices.
◦ Possible_keys. Posibles índices que se usan para la consulta.
◦ Key. Nombre del índice elegido para la consulta.
◦ Ref. Columnas o valores que se usan para hacer coincidir con la clave.
◦ Eq_ref. Se utiliza cuando la consulta aplica el índice primario de la tabla.
◦ Rows. Estimación de filas a examinar antes de resultados.
◦ Extra. Información adicional como el uso de ciertas claúsulas.
Optimización de consultas
Cuando las tablas son pequeñas es posible que MySQL decida no usar índices.
Podemos forzar a usar un índice con la claúsula FORCE INDEX después del FROM
Optimización de consultas
Consultas de INSERCIÓN, ACTUALIZACIÓN Y BORRADO
◦ Este tipo de consultas requieren, además de actualizar la tabla, actualizar los índices por lo que pueden
ser más costosas.
Es recomendable:
◦ Usar comandos INSERT con valores múltiples.
◦ Realizar inserciones masivas con LOAD DATA INFILE.
◦ En las cláusulas UPDATE Y DELETE hay que tener en cuenta que la cláusula WHERE afecta del mismo
sentido que una sentencia SELECT
◦ A mayor número de índices mayor lentitud en este tipo de sentencias.
◦ Es fundamental aumentar el tamaño de la variable de servidor key_buffer_size que define el tamaño del
buffer de índices.
◦ Dependerá de las características de nuestra máquina.
Mantenimiento de tablas
ANALYZE TABLE
◦ Analiza y almacena la distribución de claves de una tabla.
◦ Muy útil tras cargar una gran cantidad de datos para que se actualice el índice.
◦ Se escribe en el registro binario para que se replique en los esclavos de replicación.
Mantenimiento de tablas
OPTIMIZE TABLE
◦ Optimiza la tabla después de que hagamos hecho una gran cantidad de borrados y actualizaciones
sobre los datos de la tabla.
◦ Se reutiliza el espacio y desfragmenta la tabla en disco.
CHECK TABLE
◦ Revisa las tablas para buscar posibles errores
◦ Si el mensaje obtenido no es ok o Table up to date es posible que la tabla requiera reparación (mediante
el comando REPAIR en tablas MyISAM y ARCHIVE)
CHECKSUM TABLE
◦ Genera un hash de la tabla que nos permite comprobar que no se hayan producido modificaciones en
los datos
Control del optimizador
El SGBD posee un optimizador de consultas, en el caso de MySQL posee dos variables de
servidor que nos permiten configurarlo.
◦ Optimizer_prune_level. Para restringir el número de posibilidades a estudiar para optimizar la consulta.
◦ Valor 1 – Por defecto.
◦ Valor 0 – Deshabilitado. Se analiza la sentencia de manera exhaustiva.
◦ Optimizer_search_depth. Restringe el nivel de detalle a efectos de optimizar la consulta. A mayor
profundidad mejor plan pero más tiempo para obtenerlo. Valores entre 0 y 62. Por defecto 62.