¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí

Aspectos generales de MySQL

Introducción

MySQL se dio a conocer a finales de la década de 1990 como un sistema de gestión de bases de datos relacional especialmente adecuado para pequeños proyectos web, aprovechando sobre todo de su carácter gratuito y su rapidez. Después, en el transcurso de los años 2000, los gigantes de la Web se pusieron a utilizar MySQL de forma masiva. Lo siguiente fue más difícil, ya que en la segunda mitad de la década de 2000 todos estos grandes actores tuvieron que hacer frente a las limitaciones de MySQL en cuanto a su escalabilidad. Fue en ese momento cuando surgieron muchas soluciones NoSQL. Pero, finalmente, MySQL ha evolucionado de forma rápida en los últimos años, mientras que los problemas de juventud de las soluciones NoSQL se han hecho cada vez más evidentes.

Hoy en día, MySQL sigue siendo una opción muy extendida para proyectos web, mucho menos para proyectos más tradicionales. ¿Cuáles son las razones? En primer lugar, MySQL es capaz de ofrecer buenos rendimientos incluso con los servidores menos potentes. Además, su estabilidad es excelente y, en una instancia configurada de forma correcta, es muy raro que MySQL se cuelgue o pierda los datos. Por último, su carácter gratuito permite contemplar despliegues con cientos o miles de instancias en caso necesario sin gastar una fortuna en licencias.

Estas son las razones...

Arquitectura

1. El servidor y los clientes

El servidor MySQL (mysqld) intercepta las peticiones formuladas por los clientes, transforma estas peticiones en un plan de ejecución, recupera los datos según el plan de ejecución ofrecido y, por último, devuelve el resultado al cliente. Se compone de varios módulos de gestión:

  • Los protocolos de comunicación con los clientes (TCP/IP, socket SSL...).

  • Los permisos de acceso a los diferentes recursos disponibles (ver el capítulo Seguridad y gestión de los usuarios).

  • Las cachés para minimizar el acceso a disco.

  • Los diferentes tipos de registros de servidor (binarios, peticiones lentas, etc.).

  • El análisis, la optimización y la ejecución de las peticiones.

  • El almacenamiento de los datos.

El diagrama siguiente resume los distintos módulos del servidor:

images/01-01.png

Cada distribución de MySQL contiene varios clientes en línea de comando para interactuar con el servidor. Los más utilizados son:

  • mysql: para ejecutar las peticiones.

  • mysqldump: para realizar las copias de seguridad lógicas.

  • mysqladmin: para realizar las operaciones de administración (por ejemplo, consultar las estadísticas del servidor, interrumpir peticiones que duran mucho tiempo, cambiar contraseñas).

2. Los protocolos de comunicación

MySQL ofrece diferentes protocolos de comunicación entre el cliente y el servidor. Bajo UNIX...

Utilización de recursos de hardware

1. Uso del disco

Los datos se almacenan en disco para garantizar su persistencia. Encontrará en su servidor MySQL:

  • Los esquemas (o bases de datos), que aparecen en el disco como carpetas de igual nombre: por ejemplo, el nombre de la carpeta del esquema world es world.

  • Archivos que tienen la extensión .frm. Contienen la estructura de las tablas (frm de formato). Desde un punto de vista de SQL, una tabla pertenece a un esquema, lo que en el disco se traduce en al menos un archivo (que contiene la estructura de la tabla) dentro de un directorio. Por ejemplo, la tabla City, que pertenece al esquema world, está representada en el disco por el archivo City.frm, localizado en el directorio world. Los datos y los índices se encuentran en uno o varios archivos o solo en la memoria; todo depende del motor de almacenamiento. Esta parte de la arquitectura se detalla en la sección Los motores de almacenamiento.

  • Los registros del servidor (registro binario, registro de errores...), los de los motores de almacenamiento (ib_logfile0 de InnoDB, por ejemplo), de la replicación, el archivo de configuración...

  • Los disparadores (triggers).

Por defecto, todos estos archivos se almacenan en un único directorio llamado directorio de datos. La ubicación de este directorio puede configurarse con el parámetro datadir.

Podemos modificar la configuración para separar el almacenamiento...

Variantes de MySQL

1. MariaDB

Monty Widenius, el creador de MySQL, lanzó MariaDB en 2009 como alternativa a la versión oficial de Oracle.

MariaDB incorpora mejoras procedentes de la Comunidad (motor XtraDB de Percona, muchos motores de almacenamiento), así como las funcionalidades diseñadas de forma directa por los desarrolladores de MariaDB, como cambios en el optimizador de peticiones.

MariaDB tenía como objetivo ser 100 % compatible con la versión MySQL de Oracle, pero esta compatibilidad se ha roto, ya que algunas funcionalidades se han desarrollado de manera independiente de MySQL (por ejemplo: columnas virtuales, identificadores de transacción para la replicación, JSON).

La numeración de las versiones de MariaDB es a su vez totalmente independiente de la de MySQL. Por consiguiente, es difícil saber qué versión de MariaDB es más o menos equivalente a la de MySQL.

En resumen, MariaDB es interesante porque dispone de funcionalidades que MySQL no ofrece, pero las incompatibilidades con MySQL pueden complicar las migraciones.

Para más información, consulte la página del proyecto: http://www.mariadb.com

2. Percona Server

Percona empezó a desarrollar correctores para sus clientes en 2007 y, poco a poco, estos parches se unieron para formar una versión derivada de MySQL llamada Percona Server.

Percona Server es una versión mejorada de MySQL. Uno de sus objetivos es permanecer 100 % compatible con la versión oficial. Algunos parámetros no permiten la compatibilidad, pero están desactivados por defecto.

Entre las funcionalidades adicionales, podemos encontrar:

  • El Motor XtraDB, que ofrece en algunos casos mejores resultados...

Los motores de almacenamiento

Una de las características únicas de MySQL es el concepto de motores de almacenamiento. Cada motor deberá ofrecer un denominador común de funcionalidad, pero es posible añadir las funcionalidades que faltan en el servidor. Un ejemplo clásico es el de las claves externas: aunque el servidor reconozca la sintaxis, las claves externas no provocan ninguna acción específica por parte del servidor. No obstante, el motor InnoDB ofrece soporte de claves externas, lo que no es el caso del motor MyISAM, por ejemplo.

Esta arquitectura tiene, sin embargo, inconvenientes. Los motores no son todos equivalentes en términos de rendimiento: si el motor X posee una funcionalidad que no está disponible con nuestro motor actual, no está garantizado que el motor X sea más rápido. Los motores tampoco son todos equivalentes en términos de seguridad de datos: InnoDB, por ejemplo, tiene la capacidad de recuperar de forma automática los datos en caso de fallo inesperado, mientras que un fallo similar con MyISAM conllevará inevitablemente una pérdida de datos. Por último, aunque pueda ser tentador elegir un motor de almacenamiento para cada una de las tablas, no es fácil administrar un servidor en el que se emplean varios motores de almacenamiento: la memoria física del servidor se debe compartir entre los diferentes motores, los respaldos son más difíciles y diagnosticar los problemas es más complicado. Por estas razones, se recomienda utilizar un solo motor de almacenamiento.

La elección del motor se realiza durante la creación de la tabla, con el comando SQL CREATE TABLE incluyendo la cláusula ENGINE.


mysql> CREATE TABLE mi_tabla (i INT) ENGINE=InnoDB;  
Query OK, 0 rows affected (0,24 sec) 
 

Para conocer el motor de almacenamiento de una tabla, podemos usar el comando SHOW CREATE TABLE:


mysql> SHOW CREATE TABLE mi_tabla \G  
*************************** 1. row ***************************  
Table: mi_tabla  
Create Table: CREATE TABLE `mi_tabla` (  
`i` int(11) DEFAULT NULL  
  ) ENGINE=InnoDB;
 

o la base INFORMATION_SCHEMA:


mysql> SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME = 'actor' AND TABLE_SCHEMA = 'sakila';   
+------------+--------+   ...

Bloqueos y transacciones

Imaginemos que abrimos un archivo para leer su contenido y que, al mismo tiempo, otro usuario abre el archivo para modificarlo. Corremos el riesgo de encontrar contenido incoherente, ya que una parte puede haber sido modificada mientras no llegan los datos. Para asegurarnos de poder leer el archivo sin que nadie lo cambie, debemos informar a los demás usuarios.

Para MySQL, la situación es idéntica: los accesos concurrentes estarán autorizados. Por lo tanto, es posible que una petición lea un conjunto de filas, mientras que otra petición cambia algunas de estas filas. Por ello, es indispensable que cada conexión MySQL indique a las demás conexiones cuáles son los recursos que no deben ser modificados. Esta notificación se efectúa mediante la incorporación de bloqueos.

Existen dos tipos de bloqueos: los bloqueos de lectura, que permiten a otras conexiones leer los mismos datos pero no modificarlos, y los bloqueos de escritura, que prohíben a todas las demás conexiones leer o escribir.

La diferencia entre estos dos tipos de bloqueos es fácil de comprender si recordamos el ejemplo del archivo que queremos abrir. Si solo queremos leer este archivo, otros usuarios también pueden abrir el archivo para leerlo. Pero nadie tiene derecho a modificar, si no corremos el riesgo de leer datos incoherentes. Y, si deseamos actualizar el contenido del archivo, no queremos que otros usuarios puedan leer o escribir en este para evitar que el contenido sea incoherente y por lo tanto inservible.

Siguiendo la analogía del archivo abierto para lectura o escritura, si pensamos que el archivo cuenta con varias secciones, es posible que permitamos a otro usuario modificar las secciones que no estamos leyendo. En este caso, lo que leamos será siempre coherente, ya que nadie modificará el contenido, y haremos esperar menos tiempo (por no decir ninguno) a los usuarios que quieren realizar modificaciones en el archivo.

Con MySQL, el mismo principio existe: podemos bien bloquear una tabla entera, bien bloquear una o varias filas. El bloqueo de filas es mucho más potente porque permite a menudo, en cada conexión, acceder a las filas necesarias sin tener que esperar a que otras conexiones hayan terminado su trabajo. Este tipo de bloqueo está, sin embargo, disponible solo en algunos motores de almacenamiento, por ejemplo...