2ºASIR-ASGBD Hamza ElkhatibPRÁCTICA 4 UNIDAD 5: OPTIMIZACIÓN Y MONITORIZACIÓN EN MYSQL Actividad 1. Motores de almacenamiento. Actividad 1. Motores de almacenamiento de MySQL. a) Indica 4 órdenes diferentes de conocer el motor de almacenamiento de una tabla en MySQL tanto desde la línea de comandos del sistema operativo, como desde la Shell de MySQL. -SELECT table_schema, table_name, engine FROM information_schema.tables order by table_schema,table_name,engine; -SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'basedatos' AND TABLE_NAME = 'mitable'; -Con el comando Mysqlshow –u –p –i -SHOW TABLE STATUS WHERE Name = 'nombre_tabla' b) Sobre el motor de almacenamiento MyISAM ¿Cómo se almacena una tabla MyISAM en un dispositivo de almacenamiento? Cada tabla MyISAM es almacenada en disco en tres archivos cuyo nombre comienza con el nombre de la tabla y tiene una extensión que indica el tipo. El archivo con extensión .frm almacena el formato de la tabla. Los datos de la tabla se guardan en el archivo con extensión .MYD (MYData). El índice de la tabla tiene la extensión .MYI (MYIndex). Mediante capturas personalizadas de pantalla, indica en que carpetas del Sistema Operativo Ubuntu 16.04 se guardan los ficheros realizando capturas de pantalla de ello. 1 2ºASIR-ASGBD Hamza Elkhatib c) Motor de almacenamiento InnoDB ¿Qué ventajas/inconvenientes presenta el motor InnoDB sobre MyISAM solo con respecto a la utilización de índices en las tablas? InnoDB almacena sus índices en un espacio de tablas que puede estar formado de varios ficheros o varias particiones. Por el contrario cada tabla MyISAM almacenada en disco genera tres ficheros con el mismo nombre, que será el nombre del índices, pero diferentes extensiones. MyISAM es más rápido que InnoDB, puesto que en las consultas InnoDB se debe de comprobar la integridad referencial de los datos, mientras que en MyISAM eso no es necesario, ya que esa propiedad no es soportada por este motor de almacenamiento. d) Motor de almacenamiento InnoDB Crea un ejemplo de una tabla con 1 solo campo y motor de almacenamiento MyISAM ¿Qué instrucción me permite cambiar el motor de la tabla a InnoDB? Realiza la captura del proceso. La instrucción de cambio del motor de base de datos es: ALTER TABLE comercial ENGINE = InnoDB; 2 2ºASIR-ASGBD Hamza Elkhatib Actividad 2. Índices sobre la base de datos Actividad 2. Índices sobre la base de datos “filmografía.zip”. Descárgate la base de datos de ejemplo para MySQL adjunta a la tarea para la manipulación de índices. Tablas de filmografia (actor, address, city, customer, film, inventory, payment, rental, staff, etc). a) Muestra los índices de la tabla “customer”, para ver si existen o no, de dos formas distintas. SHOW KEYS y SHOW INDEX son equivalentes para mostrar los índices. 3 2ºASIR-ASGBD Hamza Elkhatib b) Analiza y explica los nombres de los índices del campo “key_name” de la tabla "customer". El campo key_name corresponde a los nombres de los índices, de la tabla “customer”. PRIMARY es el nombre del índice que corresponde a la clave primaria y los que comienzan por los prefijos idx o idx_fk los indices de las demás columnas. c) Explica de forma clara los siguientes índices de la tabla “rental” indicando sus diferencias. PRIMARY KEY (rental_id), Es un índice para generar consultas especialmente rápidas, que debe ser único y no admite NULL. UNIQUE KEY (rental_date, inventory_id, customer_id), Es el índice de campos cuyo valor no se repite en estos campos , o sea las inserciones de dichas columnas deben ser diferentes. KEY idx_fk_inventory_id (inventory_id) Es un índice, el convencional por llamarlo de alguna manera , que puede ser usado para una o varias columnas o parte de una columna. d) Modifica la tabla "film" para crear un índice parcial de campos con los 25 y 40 primeros caracteres de los campos "title" y "description" respectivamente. Con la sentencia “multicolumna” ALTER TABLE film ADD INDEX (title(25) , description(40)); Actividad 3. Utilización de EXPLAIN sobre las consultas sobre la BBDD filmografia. 4 2ºASIR-ASGBD Hamza Elkhatib Actividad 3. Uso de EXPLAIN en la tabla inventory de la base de datos. a) Dada la tabla inventario de películas (inventory) muestra las películas con identificador de película igual a 1000 y captura el resultado de la consulta. Haz uso del comando EXPLAIN para comentarlos resultados de las columnas. Con el Comando EXLAIN junto con la sentencia select, obtenemos el resultado de la optimización. id: es el número de tabla en la consulta. En este caso solo hay una. select_type: es el rol de la tabla en la consulta, en este caso es SIMPLE para consultas que no sean uniones o incluyan subconsultas. Table: es el nombre de la tabla de donde se extraen los registros. Type: el tipo de valores que se usan en la consulta, en este caso constante. Possible_keys: posibles índices que pueden usarse para buscar registros. Key: el nombre del índice que MySQL ha decidido usar. Key_len: es el tamaño del índice. Ref: valores que se usan para hacer coincidir con la clave. Rows: indica el número de filas que MySQL piensa que debe examinar antes de devolver los resultados. filtered: muestra el porcentaje estimado de filas que serán filtradas por la condición de la consulta. Con un select mostramos los nombres de las películas 5 2ºASIR-ASGBD Hamza Elkhatib b) Supongamos que no hemos definido la clave ajena sobre el campo “film_id” de la tabla “film” y tampoco un índice sobre la llave primaria “film_id” de la tabla inventario de películas “inventory”. Error de actividad, doy por hecho que es la pregunta c. c) Elimina de la tabla inventario “inventory” la clave foránea “film_id” y su correspondiente índice, volviendo a ejecutar el comando EXPLAIN sobre el select de la consulta anterior. Realiza la captura de las sentencias y de la salida de explain, comentando los resultados. En este caso la clave foránea adquiere otro nombre. Con ALTER TABLE y DROP FOREING KEY. 6 2ºASIR-ASGBD Hamza Elkhatib Con DROP INDEX borramos el índice. Y el EXPLAIN con select lo aplicamos ya a la columna film_id. El tipo de select es simple, de tipo index, el nombre del índice es idx_store_id_film_id , el número de filas para examinar la consulta es, 4581, el porcentaje de filas filtradas es del 100% y recupera la información solicitada utilizando únicamente la información del índice. Actividad 4. Optimizador de consultas de MySQL. 7 2ºASIR-ASGBD Hamza Elkhatib Actividad 4. Optimizador de consultas de MySQL a) Cambia/configura la memoria asignada para el uso de la cache, activando la cache de consultas (query_cache_***) de MySQL y lograr un rendimiento óptimo. Puedes usar SHOW variables para mostrarlas y visualizar sus valores por defecto. (***) Indican varios ficheros. Como “root” accedemos al fichero de configuración root, y comprobamos la disponibilidad de la query_cache. Con SHOW VARIABLES LIKE ‘hava_query_cache’; comprobamos su disponibilidad en workbench. b) Realiza una consulta del número de clientes de la tabla “customer” sin hacer uso de la cache de consultas de MySQL (La unidad de coste en MySQL es una lectura de una sola página aleatoria de 4 kilobytes (4096 bytes)) mostrando el resultado de dicha consulta. 8 2ºASIR-ASGBD Hamza Elkhatib En el fichero de configuración de mysql, comentamos las opciones de Mysql. Con un select customer_id from customer; y el lista visualizamos el ultimo numero. c) Calcula el coste de la consulta anterior auditando la variable de sesión “last_query_cost” interpretando el resultado. 9 2ºASIR-ASGBD Hamza Elkhatib Con show status like ‘Last_query_cost’; el resultado mostrado es cero, por lo cual no tuvo coste. d) Realiza una copia de seguridad de la base de datos filmografía con la herramienta mysqldump. Accediendo a terminal, tecleamos el comando mysqldump –u root –p nombre_base_datos > nombre_de_la_copia. e) Utiliza la herramienta mysqlslap para simular una alta carga en la base de datos filmografía (debido a múltiples usuarios conectados o a la ejecución de un elevado volumen de sentencias sql o bien ambas) realizando una consulta de todas las películas (film) con una concurrencia de 1000 y 2000 iteraciones. Con mysqlslap y los parámetros de la captura, el resultado no aparece porque necesita bastante tiempo para su ejecución. 10 2ºASIR-ASGBD Hamza Elkhatib Actividad 5. Optimización del servidor de MySQL. Actividad 5. Optimización de parámetros del servidor MySQL. a) Optimiza el número máximo de conexiones actuales al servidor MySQL. En el fichero de configuración ajustamos la directiva “max_connections”. b) Optimiza el número de tablas abiertas para todos los hilos. En el fichero de configuración ajustamos la directiva “table_cache”. 11 2ºASIR-ASGBD Hamza Elkhatib c) Optimiza el tamaño máximo para las tablas temporales tanto en memoria como en disco. En el fichero de configuración ajustamos la directiva “tmp_table_size”. d) Optimiza el tamaño del buffer usado para los bloques de índices. En el fichero de configuración ajustamos la directiva “key_buffer_size”. 12 2ºASIR-ASGBD Hamza Elkhatib e) Optimiza el uso de memoria (USO DE MEMORIA & BUFFERES) En el fichero de configuración ajustamos la directiva “innodb-buffer-pool-size”. 13