Académique Documents
Professionnel Documents
Culture Documents
La arquitectura de MySQL1 tiene como caracterstica ms notable el separar el motor de almacenamiento (que se encarga de los detalles de entrada-salida y representacin de la informacin en memoria secundaria) del resto de los componentes de la arquitectura. Es decir, el diseo del gestor est preparado para que se pueda cambiar el gestor de almacenamiento. Esto permite incluso crear nuevos motores de almacenamiento especializados para ciertas tareas o tipos de aplicaciones.
Figura 1
Las utilidades y herramientas de MySQL son los programas y aplicaciones que se incluyen con la distribucin del gestor, o que pueden instalarse como aplicaciones adicionales. Estas incluyen las herramientas de backup, el navegador de consultas (QueryBrowser), las aplicaciones administrativas de interfaz grfico y la herramienta de diseo MySQL Workbench, entre otras.
Motores de almacenamiento
El elemento ms notable de la arquitectura de MySQL es la denominada arquitectura de motores de almacenamiento reemplazables (pluggable storage engine architecture). La idea de esa arquitectura es hacer una interfaz abstracta con funciones comunes de gestin de datos en el nivel fsico. De ese modo, el gestor de almacenamiento puede intercambiarse, e incluso un mismo servidor MySQL puede utilizar diferentes motores de almacenamiento para diferentes bases de datos o para diferentes tablas en la misma base de datos. Esto permite utilizar el motor de almacenamiento ms adecuado para cada necesidad concreta. Tambin permite que terceros puedan implementar motores de almacenamiento nuevos para necesidades especficas, o adaptar el cdigo de los existentes a ciertos requisitos de almacenamiento. As, las interfaces definidas por MySQL aslan el resto de los componentes de la arquitectura de las complejidades de la gestin fsica de datos, facilitando el mantenimiento de los motores de almacenamiento. Tambin esto permite que ciertos motores de almacenamiento no implementen parte de los servicios, lo cual les hace inapropiados para algunas aplicaciones pero ms eficientes para otros. Por ejemplo, un motor de almacenamiento que no implementa bloqueos en la base de datos no debe utilizarse en aplicaciones multi-usuario, pero la ausencia de sobrecarga de procesamiento en la gestin de los bloqueos para el acceso concurrente lo har mucho ms eficiente para una aplicacin monousuario. En consecuencia, una primera tarea de diseo fsico en MySQL es la de decidir el motor de almacenamiento ms apropiado. Los elementos que puede implementar un motor de almacenamiento son los siguientes:
Concurrencia. Es responsabilidad del motor implementar una poltica de bloqueos (o no implementar ninguna). Una estrategia de bloqueos por fila permite una mayor concurrencia, pero tambin consume ms tiempo de procesamiento en aplicaciones en las que la concurrencia no es realmente grande.
Soporte de transacciones. No todas las aplicaciones necesitan soporte de transacciones. Comprobacin de la integridad referencial, declarada como restricciones en el DDL de SQL. Almacenamiento fsico, incluyendo todos los detalles de la representacin en disco de la informacin. Soporte de ndices. Dado que la forma y tipo de los ndices depende mucho de los detalles del almacenamiento fsico, cada motor de almacenamiento proporciona sus propios mtodos de indexacin (aunque algunos como los rboles B casi siempre se utilizan).
Cachs de memoria. La eficiencia de los cachs de datos en memoria depende mucho de cmo procesan los datos las aplicaciones. MySQL implementa cachs comunes en el gestor de conexiones y la cach de consultas, pero algunos motores de almacenamiento pueden implementar cachs adicionales.
Otros elementos para ayudar al rendimiento, como puede ser el uso de mltiples hilos para operaciones paralelas o mejoras de rendimiento para la insercin masiva.
Adems de lo anterior, los motores de almacenamiento pueden implementar caractersticas no comunes, como la gestin de tipos de datos geoespaciales, o cualquier funcin adicional especfica de cierto tipo de aplicaciones. La implementacin de un gestor de almacenamiento implica escribir un software con una interfaz en lenguaje C, que implemente una biblioteca de funciones (storage engine API) que es la que el servidor MySQL invoca para pedir los servicios al gestor. Por ejemplo, si estamos implementando un gestor de almacenamiento, una de las funciones es la que crea una nueva tabla, que tiene la siguiente signatura.
Support Comment YES YES Default engine as of MySQL 3.23 with great performance Hash based, stored in memory, useful for temporary tables
DEFAULT Supports transactions, row-level locking, and foreign keys NO YES Supports transactions and page-level locking /dev/null storage engine (anything you write to it disappears)
NO YES NO NO YES
Example storage engine Archive storage engine CSV storage engine Clustered, fault-tolerant, memory-based tables Federated MySQL storage engine Collection of identical MyISAM tables Obsolete storage engine
De la tabla anterior solo podemos tener nociones iniciales del tipo de gestor, y dirigirnos a alguno de ellos para casos concretos, por ejemplo, ndbcluster tiene caractersticas nicas si necesitamos soporte para alta disponibilidad. No obstante, hace falta conocer ms en profundidad las caractersticas de cada uno para tomar decisiones, y en ocasiones es necesario hacer pruebas de rendimiento con varios de ellos para compararlos y seleccionar el que mejor se ajusta a nuestras necesidades.
Los conectores
Los conectores son bibliotecas en diferentes lenguajes de programacin que permiten la conexin (remota o local) con servidores MySQL y la ejecucin de consultas. Por ejemplo, el conector Connector/J permite conectarse a MySQL desde cualquier aplicacin programada en lenguaje Java, y utilizando el Java Database Connectivity (JDBC) API.
El gestor de conexiones
La gestin de conexiones es responsable de mantener las mltiples conexiones de los clientes. Un gestor de conexiones inexistente o laxo simplemente creara una conexin por cada cliente conectado. No obstante, las conexiones consumen recursos de mquina, y crearlas y destruirlas son tambin procesos costosos. Por eso, el gestor de conexiones de MySQL puede configurarse para limitar el nmero de conexiones concurrentes, y tambin implementa un pool de conexiones. La idea es que muchas aplicaciones abren una conexin y la mantienen abierta y ociosa durante mucho tiempo (por ejemplo, durante toda la sesin de un usuario, que de vez en cuando se levanta para diferentes tareas mundanas como tomar caf), y solo de vez en cuando se utiliza un hilo de ejecucin para ejecutar una consulta, que adems, tpicamente tarda como mucho unos milisegundos. No tiene sentido mantener una conexin ociosa para cada usuario. De aqu proviene la idea de los pools de conexiones: hay un nmero de conexiones disponibles, y cada vez que una aplicacin hace una solicitud, se le asigna una conexin del pool que no est ocupada. Lgicamente, la aplicacin cliente no es consciente de este mecanismo. En trminos por ejemplo, de las interfaces JDBC, esto quiere decir que cada vez que enviamos una sentencia con llamadas como Statement.executeQuery()realmente puede que se cree una nueva coleccin, o quiz se
tome una del pool. Es decir, las llamadas a Driver.getConnection() y a Connection.close() no siempre determinan el tiempo de vida de una conexin real en MySQL. Adems de la reduccin en el tiempo de establecimiento de conexin (si se reusa una conexin ya creada del pool), la tcnica permite limitar el nmero de conexiones simultneas. Dado que las conexiones consumen recursos, es mejor limitar este nmero que llevar a una carga excesiva en el servidor, que podra acabar en una cada del sistema o un comportamiento impredecible. Ntese que gracias a los pools de conexiones, puede darse servicio a muchas conexiones concurrentes con un nmero limitado de conexiones que se reutilizan. El gestor de conexiones tambin se ocupa de la autentificacin de los usuarios. La autentificacin por defecto se basa en el nombre de usuario, la mquina desde la que se conecta y la password. El servidor puede tambin configurarse para soportar certificados X.509.
La cach de consultas
MySQL implementa un cach de consultas, donde guarda consultas y sus resultados enteros. De este modo, el procesador de consultas, antes ni siquiera de plantear la optimizacin, busca la consulta en la cach, para evitarse realizar el trabajo en el caso de que tenga suerte y encuentre la consulta en la cach.
El Control de Concurrencia
El control de concurrencia en un gestor de bases de datos es simplemente el mecanismo que se utiliza para evitar que lecturas o escrituras simultneas a la misma porcin de datos terminen en inconsistencias o efectos no deseados. El mecanismo que se utiliza para controlar este acceso es el de los bloqueos (locks). La idea es muy simple, cada vez que una aplicacin quiere acceder a una porcin de los datos, se le proporciona un bloqueo sobre los mismos. Lgicamente, varias aplicaciones que quieran leer simultneamente no tienen ningn problema en hacerlo, de modo que para la lectura se proporcionan bloqueos compartidos (shared locks). Sin embargo, varios escritores o un escritor simultneo con lectores puede producir problemas. Por eso, para la escritura se proporcionan bloqueos exclusivos (exclusive locks).
Aunque la idea parece simple, hay que tener en cuenta que la obtencin y liberacin de los bloqueos se realiza continuamente, y esto produce una sobrecarga en el procesamiento dentro del servidor. Adems, hay diferentes polticas de bloqueo, por ejemplo, es mejor bloquear cada tabla completa afectada o solo las filas de la tabla a las que quiere acceder una consulta?. Dada la existencia de diferentes tcnicas, el control de concurrencia en MySQL se divide entre el servidor y cada gestor de almacenamiento.