Documentos de Académico
Documentos de Profesional
Documentos de Cultura
DesenoFisico MySQL PDF
DesenoFisico MySQL PDF
Miguel R. Luaces
Laboratorio de Bases de Datos
Universidade da Coruña
Contenidos
1 Introducción a MySQL
2 Replicación
3 Copia de seguridad y recuperación
4 Medición de rendimiento y perfilado
Medición del rendimiento
Perfilado de aplicaciones
5 Optimización
Optimización de esquemas e ı́ndices
Optimización de hw. y sw.
Optimización del servidor
Contenidos
1 Introducción a MySQL
2 Replicación
3 Copia de seguridad y recuperación
4 Medición de rendimiento y perfilado
Medición del rendimiento
Perfilado de aplicaciones
5 Optimización
Optimización de esquemas e ı́ndices
Optimización de hw. y sw.
Optimización del servidor
MariaDB
An enhanced, drop-in replacement for MySQL
Versión actual: 5.5.36
Documentación: https://kb.askmonty.org/en/
Funciona sobre todas las plataformas: Mac OS X, Windows,
GNU/Linux
Mejoras sobre MySQL 5.5:
Más motores de almacenamiento (ej.: No-SQL)
Optimizaciones
Extensiones (ej.: virtual columns)
Completamente Open Source
Arquitectura de MySQL
Clientes
Caché de Analizador
consultas sintáctico
optimizador
Motores de almacenamiento
Enxeñarı́a Informática Miguel R. Luaces (luaces@udc.es) - Juan Ramón López Rodrı́guez
BD3: Diseño Fı́sico - MySQL
Introducción a MySQL
Arquitectura de MySQL
Cada consulta es atendida por un thread del pool servidor
La caché consultas almacena sentencias select junto con su resultado
Si la consulta no está en caché, tras el análisis sintáctico, se realiza
la optimización del plan de ejecución
Reescritura de la consulta
Determinación del orden de acceso a las tablas
Selección de los ı́ndices a utilizar
Inclusión de las caracterı́sticas especı́ficas de los motores de
almacenamiento
Arquitectura de MySQL
Caracterı́stica única: separación de tareas de servidor (conexiones,
procesamiento de consultas, optimización) de tareas de
almacenamiento y recuperación de datos
Se puede elegir el motor de almacenamiento a nivel de tabla
Se pueden cargar motores de almacenamiento en tiempo de ejecución
Describiremos brevemente los siguientes aspectos de MySQL:
Control de concurrencia
Gestión de transacciones
Motores de almacenamiento
Criterios de selección
Control de concurrencia
Los bloqueos permiten evitar que un cliente lea un fragmento de
datos mientras otro lo está cambiando
Hay dos tipos de bloqueos: compartidos (lectura) y exclusivos
(escritura)
Los SGBD permiten distintas granularidades a los bloqueos (tabla,
página o fila)
Los bloqueos de fila minimizan la cantidad de datos por lo que
aumenta la concurrencia
Los bloqueos de tabla minimizan el consumo de memoria por lo que
aumenta el rendimiento
Cada motor de almacenamiento de MySQL define su propia polı́tica
y granularidad. El servidor no es consciente de los bloqueos.
Control de concurrencia
MyISAM, Memory y Merge realizan bloqueos a nivel de tabla
Cada motor lo implementa a su modo con optimizaciones para
mejorar el rendimiento
Necesita muy poca memoria
Ideal en el caso de que las lecturas sean mucho más frecuentes que
las modificaciones
Es eficiente en el caso de modificaciones simultáneas en varias filas
InnoDB realiza bloqueos a nivel de fila
Permite la máxima concurrencia a costa de mayor consumo de
memoria
Ideal en el caso de cambios frecuentes o transacciones largas
Es muy eficiente en el caso de cancelación de transacciones
El servidor de MySQL puede bloquear tablas independiente del motor
para garantizar corrección de sentencias DDL como ALTER TABLE
Gestión de transacciones
MySQL incluye motores transaccionales (InnoDB) y no
transaccionales (MyISAM, Memory)
El estándar SQL define cuatro niveles de aislamiento:
Read uncommited
Read commited
Repeatable read
Serializable
Las figuras de las siguientes diapositivas se extrajeron de aquı́:
http://www.byteslounge.com/tutorials/spring-transaction-isolation-tutorial
Gestión de transacciones
Read uncommited
No hay bloqueos, por lo que una transacción lee datos sin confirmar
de otra transacción
Permite lecturas sucias porque la segunda transacción podrı́a ser
cancelada
Gestión de transacciones
Read commited
Los bloqueos de escritura se mantienen hasta el fin de la transacción
Los de lectura se liberan al finalizar la lectura
Una transacción sólo lee datos de transacciones confirmadas
Permite lecturas no-repetibles porque los datos podrı́an cambiar
después de leidos
Gestión de transacciones
Repeatable read
Todos los bloqueos se mantienen durante toda la transacción
Cualquier fila que lea una transacción será igual en sucesivas lecturas
Como no hay bloqueo de rangos, permite lecturas fantasma
Es la predeterminada en InnoDB
Gestión de transacciones
Serializable
Aislamiento completo de las transacciones usando bloqueos de rango.
InnoDB permite el nivel de aislamiento serializable mediante
Multiversion Concurrency Control (MVCC)
Mantiene instantáneas de los datos tal y como existı́an en un
determinado momento
Diferentes transacciones ven simultáneamente datos distintos en las
mismas tablas
Evita la necesidad de bloquear filas en modo lectura
Gestión de transacciones
Interbloqueos (Deadlocks)
El funcionamiento de los bloqueos es especı́fico del motor de
almacenamiento
Los interbloqueos son inevitables ya que ocurren por conflictos reales
en las transacciones
Los interbloqueos producen consultas lentas o que sobrepasan tiempo
máximo
La solución consiste en reanudar alguna de las transacciones
InnoDB detecta dependencias circulares y reanuda la transacción con
los bloqueos de fila menos exclusivos
Gestión de transacciones
Registro de transacciones (Write-ahead logging)
El almacenamiento inmediato de los cambios en los datos es lento
Los cambios realizan en la copia en memoria de la página de disco
El almacenamiento en disco se realiza mediante un registro de
transacciones usando escritura secuencial (y por tanto, rápida)
Los datos en disco se escriben cuando la página se elimina de
memoria
En caso de fallo del servidor, los cambios se pueden recuperar
Uso de varios motores de almacenamiento en transacciones
Cada motor de almacenamiento gestiona el funcionamiento de las
transacciones
No se pueden combinar de forma fiable motores de almacenamiento
diferentes en una transacción
Por ejemplo, los cambios en tablas MyISAM no se pueden deshacer
con un rollback
MySQL no informa del error de ninguna manera
Contenidos
1 Introducción a MySQL
2 Replicación
3 Copia de seguridad y recuperación
4 Medición de rendimiento y perfilado
Medición del rendimiento
Perfilado de aplicaciones
5 Optimización
Optimización de esquemas e ı́ndices
Optimización de hw. y sw.
Optimización del servidor
Definición de replicación
Consiste en configurar uno o varios servidores como esclavos - o
réplicas - de otro servidor
Problema a resolver: mantener los datos de los servidores
sincronizados
Base para construir aplicaciones extensas y de alto rendimiento
Admite diferentes topologı́as
Muchos esclavos pueden conectarse a un maestro
Un esclavo puede, a su vez, actuar como maestro
Se puede replicar:
todo el servidor
determinadas bases de datos
sólo algunas tablas
Funcionamiento de la replicación
El maestro registra todos sus cambios como eventos del registro
binario (binary log)
El esclavo copia los eventos del registro binario a su registro de
repetición (relay log)
El esclavo repite todos los eventos del registro de repetición sobre
sus propios datos
Funcionamiento de la replicación
El registro binario de mySQL:
Funcionamiento de la replicación
El registro binario de mySQL permite tres tipos de replicación:
Basada en sentencias (statement-based replication)
Se registra la instrucción que cambia los datos en el maestro
La utilizada por defecto. Sencilla de implementar y compacta.
Estable desde MySQL 3.23
Hay instrucciones que no se pueden replicar (detalles en el manual)
Basada en filas (row-based replication)
Se registran las filas cambiadas y el cambio realizado
Permite la replicación de cualquier instrucción
El registro aumenta de tamaño
No es fácil auditar los cambios realizados
Mixta (mixed-format replication)
MySQL decide en función de la instrucción que se ejecuta si se usa
replicación basada en sentencias o en filas
Se usa la replicación basada en sentencias a no ser que la instrucción
no sea segura
Ver la descripción en el manual
Enxeñarı́a Informática Miguel R. Luaces (luaces@udc.es) - Juan Ramón López Rodrı́guez
BD3: Diseño Fı́sico - MySQL
Replicación
Funcionamiento de la replicación
El proceso para configurar la replicación es el siguiente:
Configurar cuentas de replicación en cada servidor
El thread E/S del esclavo hace una conexión TCP/IP al maestro
para leer el registro binario. Por lo tanto, necesita una cuenta de
usuario en el maestro con los permisos apropiados
Configurar maestro
Activar el registro binario y asignarle un id al servidor
Configurar esclavo
Asignarle un id al servidor y activar el registro de repetición
Inidicar al esclavo como conectarse al maestro y desde qué punto del
registro binario hay que replicar
Opcionalmente, activar el registro binario y configurar su
actualización
Funcionamiento de la replicación
Es posible replicar sólo parte de los eventos de un servidor,
utilizando diferentes tipos de filtros
Filtros sobre el registro binario del maestro
Filtros sobre el registro de repetición
Topologı́as de replicación
Las restricciones en la replicación son las siguientes:
Cada esclavo sólo puede tener un maestro
Un maestro puede tener muchos esclavos
Un esclavo puede actuar también como maestro
Estas restricciones permiten diferentes topologı́as con diferentes
aplicaciones
Un maestro, múltiples esclavos
Maestro-maestro en modo activo-activo
Maestro-maestro en modo activo-pasivo
Anillo
Maestro, maestro de distribución, esclavos
Árbol o pirámide
Topologı́as de replicación
Un maestro, múltiples esclavos
Topologı́as de replicación
Un maestro, múltiples esclavos
La topologı́a más sencilla y más común
Todas las escrituras se realizan en el maestro, las lecturas se pueden
realizar en cualquier servidor
El número de esclavos está limitado por la capacidad de
procesamiento y el ancho de banda del maestro
Variantes:
Usar cada esclavo para funciones diferentes (ej.: ı́ndices diferentes,
motores diferentes)
Tener un esclavo en un centro remoto para recuperarse de un
desastre
Retrasar un esclavo en el tiempo para facilitar la recuperación
Utilizar un esclavo para copia de seguridad, para pruebas o para
desarrollo
Topologı́as de replicación
Maestro-maestro en modo activo-activo
Topologı́as de replicación
Maestro-maestro en modo activo-pasivo
Topologı́as de replicación
Anillo
Topologı́as de replicación
Anillo
Tres o más maestros
Cada servidor es un esclavo del servidor que está antes en el anillo, y
maestro del servidor que está después
Configuración simétrica, failover fácil.
Es una configuración frágil:
Depende enormemente de que todos los nodos funcionen
correctamente
Difı́cil que estén todos sincronizados a la vez: detener algún nodo es
complicado
Si eliminamos un nodo sin tener cuidado, sus eventos pueden
propagarse de forma infinita por el anillo. ¡El único nodo que filtra un
evento es el que lo ha generado!
Topologı́as de replicación
Maestro, maestro de distribución, esclavos
Topologı́as de replicación
Maestro, maestro de distribución, esclavos
Similar a la topologı́a maestro-esclavos, pero no sobrecarga al
maestro principal
El maestro principal sólo tiene un esclavo que a su vez actúa como
maestro de distribución
El maestro de distribución usa el motor BlackHole que graba en el
registro binario pero no mantiene tablas ni datos
Topologı́as de replicación
Árbol o pirámide
Topologı́as de replicación
Árbol o pirámide
Si hay muchos esclavos, puede ser mas rentable un diseño en
pirámide
Esto alivia la carga del maestro y la redistribuye por los diferentes
esclavos
Desventaja: fallos en niveles intermedios afectan a un gran número
de servidores
Además, cuantos más niveles intermedios, más difı́cil y complicado
es manejar los fallos
Problemas en la replicación
La replicación implica varias tareas complejas:
Contenidos
1 Introducción a MySQL
2 Replicación
3 Copia de seguridad y recuperación
4 Medición de rendimiento y perfilado
Medición del rendimiento
Perfilado de aplicaciones
5 Optimización
Optimización de esquemas e ı́ndices
Optimización de hw. y sw.
Optimización del servidor
Introducción
Recuperación no es restauración
Restaurar: recuperar datos desde una copia de seguridad y cargarlos
en una base de datos
Recuperar: todo el proceso de rescatar un sistema o parte de él.
Incluye todos los pasos para lograr que un servidor vuelva a ser
completamente funcional y operativo:
Restaurar copia de seguridad
Reiniciar servidor
Cambiar configuración
Calentar las cachés del servidor
Utilidades de las copias de seguridad
Recuperación ante desastres. Un error importante corrompe los datos
o el servidor
Recuperación ante cambios no deseados. La gente cambia de idea, y
ocurre más a menudo que los desastres
Auditorı́as. Necesidad de recuperar datos o esquema en algún
momento del pasado (ej. temas judiciales)
Pruebas. La manera más fácil de cargar un servidor de pruebas con
datos es usando una copia de seguridad
Enxeñarı́a Informática Miguel R. Luaces (luaces@udc.es) - Juan Ramón López Rodrı́guez
BD3: Diseño Fı́sico - MySQL
Copia de seguridad y recuperación
Introducción
El mejor sistema de copias de seguridad no es suficiente. Un buen
plan de recuperación es fundamental
El procedimiento de recuperación es complejo. Es fácil cometer
errores
Las copias de seguridad son rutinarias y no se realizan bajo
situaciones de presión extrema. La recuperación se hace en medio de
una situación de crisis
Una persona puede planear, diseñar e implementar las copias de
seguridad, pero podrı́a no estar disponible cuando se produzca el
desastre. Es necesario formar a personal cualificado para que se
encargue de la recuperación
Alternativas que no son copias de seguridad
La replicación no es una copia de seguridad
Usar discos en RAID
¿Cómo nos recuperamos en estos casos de un DROP DATABASE?
Contenidos
1 Introducción a MySQL
2 Replicación
3 Copia de seguridad y recuperación
4 Medición de rendimiento y perfilado
Medición del rendimiento
Perfilado de aplicaciones
5 Optimización
Optimización de esquemas e ı́ndices
Optimización de hw. y sw.
Optimización del servidor
Contenidos
1 Introducción a MySQL
2 Replicación
3 Copia de seguridad y recuperación
4 Medición de rendimiento y perfilado
Perfilado de aplicaciones
5 Optimización
Contenidos
1 Introducción a MySQL
2 Replicación
3 Copia de seguridad y recuperación
4 Medición de rendimiento y perfilado
Perfilado de aplicaciones
5 Optimización
Proceso de perfilado
Es necesario incluir código de perfilado en las aplicaciones que tome
mediciones de:
Tiempo total de ejecución de la página
Tiempo de ejecución de las consultas
Tiempo de llamadas a recursos externos (servicios web)
Es una sobrecarga al sistema, por lo que es necesario aplicar tácticas
como
Sólo realizar el perfilado en un porcentaje pequeño de las peticiones
Guardar los datos en memoria y hacerlos persistentes en bloque
Perfilado en MySQL
MySQL mantiene dos registros de consultas: el registro general y el
registro de consultas lentas
El registro general
Se guardan todas las consultas que se reciben aunque por error no se
terminen ejecutando
Se guardan los eventos de conexión y desconexión
Sin tiempos de ejecución: de poco interés para el perfilado
El registro de consultas lentas
Registra las consultas ejecutadas que sobrepasan un determinado
tiempo
Se puede configurar para registrar también las consultas que no
utilizan ı́ndices
Guarda tiempos de ejecución: permite perfilado
Es difı́cil de utilizar:
Una consulta es lenta porque tarda más de lo esperado, no porque
tarda más que un umbral de tiempo
Hay consultas que no tienen que usar el ı́ndice de ningún modo
Perfilado en MySQL
Desde la versión 5.1.28, MySQL permite realizar perfilado de los
recursos usados en una sesión
Se activa mediante la variable profiling
Se consulta mediante SHOW PROFILES y SHOW PROFILE [FOR
QUERY n]
Registra multitud de variables para cada uno de los estados de todas
las consultas ejecutadas
Los datos se pueden consultar agregados o a nivel de consulta
individual
Los datos se guardan en memoria mientras dure la sesión
La estrategia de análisis de resultados puede ser:
Comprobar qué consultas tienen más impacto
Comprobar el plan de ejecución de esas consultas con EXPLAIN
Realizar los ajustes necesarios
Repetir el análisis
Contenidos
1 Introducción a MySQL
2 Replicación
3 Copia de seguridad y recuperación
4 Medición de rendimiento y perfilado
Medición del rendimiento
Perfilado de aplicaciones
5 Optimización
Optimización de esquemas e ı́ndices
Optimización de hw. y sw.
Optimización del servidor
Índices
Más importantes a medida que nuestros datos crecen
Por ejemplo, en una consulta como
SELECT first_name FROM actor where actor_id=5;
Si hay ı́ndice sobre actor id se busca sobre el ı́ndice y se recuperan
punteros a las filas en la tabla
Si se define el ı́ndice sobre varias columnas el orden en el que se
indican las columnas es muy importante ya que MySQL sólo busca
eficientemente el prefijo en la parte más a la izquierda del ı́ndice
Crear un ı́ndice sobre dos columnas no es lo mismo que crear dos
ı́ndices de una sola columna independientes
Los ı́ndices se implementan a nivel de motor de almacenamiento (no
en capa de servidor), por lo que no todos los motores admiten todos
los tipos de ı́ndices
Árbol B y B+
Admitido por todos los motores (menos Archive)
Cada motor lo implementa a su modo. Por ejemplo, MyISAM usa
compresión mientras que InnoDB no usa compresión
Idea general: todos los valores se almacenan en orden y se accede
mediante un árbol en el que cada hoja está a la misma distancia de
la raı́z y las páginas de hojas contienen punteros a los registros de la
tabla.
Agiliza acceso a los datos. Se realiza un acceso al nodo raı́z y e va
descendiendo por las ramas escogiendo punteros adecuados hasta
llegar al valor correcto.
Árbol B y B+
Árbol B y B+
Tipos de consulta que pueden usar ı́ndice de un árbol B
Coincidencia con valor completo.
apellidos = ’Allen’ and nombre = ’Cuba’ and fnac = ’01-01-1960’
Coincidencia parcial con prefijo de columna
apellidos like ’A %’
Coincidencia parcial con prefijo más a la izquierda
apellidos = ’Allen’ and nombre like ’C %’
Coincidencia con rango de valores
apellidos >= ’Allen %’ and apellidos <= ’Barrimore %’
Cláusulas ORDER BY por los campos del ı́ndice
Árbol B y B+
Limitaciones. No son útiles en:
Búsquedas que no empiezan en la parte más izquierda de las
columnas indizadas. Ejemplos:
nombre = ’Cuba’ and fnac = ’01-01-1960’
apellidos like ’ %Z’
No permiten saltar columnas del ı́ndice. Ejemplo:
apellidos = ’Allen’ and fnac = ’01-01-1960’
No se optimiza el acceso a columnas a la derecha de la primera
condición de rango. Por ejemplo:
apellidos = ’Allen’ AND nombre >= ’J’ AND fnac = ’23-12-1976’
Índices Hash
Sólo soportado por el motor Memory (el indice por defecto)
Para cada fila se crea un código hash con las columnas indizadas
El ı́ndice es una tabla hash con apuntadores de fila (muy compactos)
Las colisiones de la función hash se almacenan con una lista enlazada
Útil sólo para búsquedas que usan todas las columnas del ı́ndice. No
admiten coincidencia parcial de clave
Problemas
No se pueden usar los ı́ndices para ordenar ya que el ı́ndice ordena
por hash, no por el valor original.
No evita leer las filas ya que en el ı́ndice sólo se almacena un punto
al registro
Sólo permite comparaciones de igualdad (=, IN) pero no consultas
de rangos (>100)
Las colisiones de la función hash ralentizan el acceso y el
mantenimiento
Es posible simular ı́ndice hash con una columna extra, un árbol B+ y
triggers
Enxeñarı́a Informática Miguel R. Luaces (luaces@udc.es) - Juan Ramón López Rodrı́guez
BD3: Diseño Fı́sico - MySQL
Optimización
Optimización de esquemas e ı́ndices
Índices agrupados
Las filas de las tablas se guardan en las páginas hoja del ı́ndice
Las filas con valores de clave adyacentes se guardan juntas
Ahorra operaciones de E/S en consultas con datos relacionados
Los ı́ndices tradicionales pueden ocupar más espacio del esperado ya
que en vez de punteros a registros almacenan valores de clave
primaria
No todos los motores los admiten
InnoDB lo hace implı́cito con la clave primaria, con un ı́ndice único
sin valores NULL, o con una clave interna oculta
Inconvenientes:
Sólo ahorra E/S si los datos no caben en memoria
La velocidad de inserción depende del orden de inserción (lo mejor,
en el orden de la clave primaria)
La actualización es costosa debido a la reubicación de páginas
Páginas más sujetas a fragmentación al insertar filas nuevas
Pueden ser más lentas para escaneos completos
Enxeñarı́a Informática Miguel R. Luaces (luaces@udc.es) - Juan Ramón López Rodrı́guez
BD3: Diseño Fı́sico - MySQL
Optimización
Optimización de esquemas e ı́ndices
Otros ı́ndices
Índices espaciales (árbol R)
Sólo en motor MyISAM
Sólo para los tipos de datos y operaciones de geometrı́a espacial
(GEOMETRY)
El soporte espacial de MySQL no es muy completo
Índices de texto completo
Sólo en el motor MyISAM
Permite búsquedas de palabras clave en textos y cálculo de
relevancias
Soporta conceptos de recuperación de información (stopwords,
lematización, búsqueda booleana)
Tablas de contadores
Se aconseja que las tablas de contadores sean independientes
Resulta en tablas rápidas y pequeñas
Un contador es esencialmente un semáforo que crea problemas de
concurrencia
CREATE TABLE hit_counter (cnt int unsigned not null);
UPDATE hit_counter SET cnt=cnt+1;
Se recomienda paralelizar mediante contadores parciales:
CREATE TABLE hit_counter (slot tinyint unsigned not null
primary key, cnt int unsigned not null);
UPDATE hit_counter SET cnt=cnt+1 WHERE slot=RAND()*100;
SELECT SUM(cnt) FROM hit_counter;
Desnormalización
Las actualizaciones normalizadas son más rápidas que las no
normalizadas
En los datos normalizados no hay redundancia por lo que hay menos
datos que modificar
No tener redundancia implica un menor uso de DISTINCT o
GROUP BY
Las tablas normalizadas son más pequeñas por lo que encajan mejor
en memoria
Sin embargo, en un esquema normalizado las recuperaciones
implican combinaciones que son costosas
Contenidos
1 Introducción a MySQL
2 Replicación
3 Copia de seguridad y recuperación
4 Medición de rendimiento y perfilado
Medición del rendimiento
Perfilado de aplicaciones
5 Optimización
Optimización de esquemas e ı́ndices
Optimización de hw. y sw.
Optimización del servidor
Introducción
El hardware y el software sobre los que se ejecuta SGBD determinan
la eficiencia de MySQL (tamaño de disco, memoria disponible,
recursos de CPU, red . . . )
Se necesitan directrices para resolver cuellos de botella del hardware
y del sistema operativo
Prestaremos atención a los siguientes aspectos
Selección de CPU
Equilibrar recursos de memoria y disco
Elegir discos (RAID, NAS)
Configuración de red
Introducción
Cuellos de botella comunes:
Saturación de CPU. Común cuando MySQL trabaja con datos que
caben en memoria o pueden ser leı́dos de disco tan rápido como sea
necesario. Ejemplos: ops. criptográficas intensivas, combinaciones sin
ı́ndices
Saturación E/S. Se trabaja con más datos de los que caben en
memoria. Se vacı́a caché para traer más datos, y al rato los datos
vaciados se tienen que volver a cargar
Posibles errores de interpretación:
Escasez de memoria se puede interpretar como falta de capacidad
E/S
Bus de memoria saturado se puede interpretar como problema de la
CPU
Selección de la CPU
¿CPU rápida o muchas CPUs no tan rápidas?
MySQL aprovecha mal el paralelismo ya que asigna una operación a
una CPU. Problemas de escala con muchas CPU
En función del tipos de rendimiento deseable:
Baja latencia
Tiempo de respuesta rápido para cada consulta.
Mejor CPUs rápidas porque cada petición sólo aprovecha una CPU.
Alto rendimiento:
Muchas peticiones simultáneas.
Mejor muchas CPUs, pero como MySQL escala mal no funciona el
“cuantas más mejor”.
Al final: meter más CPUs hasta que deje de compensar y llegados a
ese punto: intentar que sean lo más rápidas posible.
Selección de la CPU
¿Cuándo compensan muchas CPUs?
MySQL puede aprovechar CPUs “secundarias” para tareas en segundo
plano (ops. de red, limpieza de búferes InnoDB)
Esas tareas son “menores” en comparación con la ejecución de
peticiones de los usuarios
Muchas CPUs compensan realmente si:
Muchas conexiones que acceden a tablas diferentes (no compiten por
bloqueos)
Rendimiento total del servidor más importante que el tiempo de
respuesta de una petición particular
Selección de discos
Factores a tener en cuenta:
Capacidad de almacenamiento
No suele ser un problema (tamaño actual de los discos más que
suficiente)
Práctica estándar: combinar discos pequeños y RAID
Ventajoso tener más capacidad de la necesaria: aumenta la localidad
de los datos
Velocidad de transferencia: no suele ser un factor que limite las
aplicaciones online
Tiempo de acceso: es el factor determinante para agilizar búsquedas
aleatorias
Tamaño fı́sico: discos más pequeños son más rápidos y ocupan
menos (fı́sicamente)
El aprovechamiento depende del motor. InnoDB escala bien entre 10
y 20 discos
Selección de discos
Selección de RAID
Selección de discos
Múltiples volúmenes ¿Dónde colocamos los archivos?
Archivos de datos e ı́ndice
Archivos de registros transaccionales
Archivos de registros binarios
Archivos de registro general (registros de errores, registro de
peticiones, registro de consultas lentas, . . . )
Archivos y tablas temporales
Por defecto, todos los archivos en un único directorio
InnoDB:
datos e ı́ndices en un único conjunto de archivos
Sólo los archivos de definición de tablas van aparte, en el directorio
de cada base de datos
Selección de discos
Múltiples volúmenes
Usar múltiples volúmenes puede ayudarnos a gestionar E/S pesada
Regla clásica: registros transaccionales y archivos de datos en
volúmenes diferentes
E/S secuencial de tx. no interfiere con E/S aleatoria de datos
En realidad, no es tal ventaja
Escrituras en registro son pequeñas
Cachés RAID agrupan escrituras: se convierten en muchas menos
escrituras por segundo
No interfieren con E/S de datos
Ventaja real:
En caso de fallo, mucho más seguro tenerlos separados
Si se pierden los datos: se pueden recuperar usando el registro
Recuperación point-in-time
Selección de discos
Dedicar discos a registros transaccionales depende del coste, no del
rendimiento
Ejemplo:
4 discos duros: 2 para datos, 2 para registros transaccionales
1/2 del disco perdido para datos
1 disco para un trabajo trivial (la caché del disco hace todo el trabajo)
10 discos duros: 2 para datos, 2 para registros transaccionales
Proporcionalmente menos caro
Configuración tı́pica:
SO, swap y registros binarios en RAID 1
Resto: un único volumen en RAID 5 o RAID 10
Configuración de red
El mayor problema es la latencia
En una aplicación tı́pica hay muchas transferencias pequeñas y se
suman los retrasos de cada transmisión
La causa principal es la pérdida de paquetes, 1 % de pérdida produce
degradación significativa
Optimizaciones:
Pocas conexiones, peticiones o resultados grandes: aumentar el
tamaño del buffer TCP
Aumenta el número de paquetes que se pueden mandar “de una
tacada”
Modificable en origen y destino
Sólo conexiones locales: acortar timeout de cierre de conexión (por
defecto, un minuto)
Otras: Eliminar latencia resolución DNS: skip name resolve
Contenidos
1 Introducción a MySQL
2 Replicación
3 Copia de seguridad y recuperación
4 Medición de rendimiento y perfilado
Medición del rendimiento
Perfilado de aplicaciones
5 Optimización
Optimización de esquemas e ı́ndices
Optimización de hw. y sw.
Optimización del servidor
Introducción
No existe el archivo de configuración óptimo.
Cada servidor necesita una configuración diferente, dependiendo de:
hardware
tamaño datos,
tipos de consultas
Requisitos del sistema (tiempo de respuesta, duración tx,
consistencia, . . . )
La configuración de MySQL predeterminada está pensada para no
utilizar muchos recursos.
No da por hecho máquina dedicada.
Reserva recursos suficientes para iniciar MySQL y ejecutar consultas
sobre pocos datos
Para definir configuración a medida:
Partir de alguno de los ficheros de configuración de ejemplo.
No esperar muchas mejoras con cada cambio
Inicialmente, cambios que duplican o triplican rendimiento
Después, mejoras incrementales
Enxeñarı́a Informática Miguel R. Luaces (luaces@udc.es) - Juan Ramón López Rodrı́guez
BD3: Diseño Fı́sico - MySQL
Optimización
Optimización del servidor
Introducción
La configuración permanente MySQL se almacena fichero my.cnf
Se configura mediante la asignación de valores a variables
Es posible ejecutar múltiples instancias desde una sola configuración
con secciones independientes.
Ámbitos de las variables:
Global (se aplican al servidor y a cada conexión)
Sesión (se aplican a una conexión especı́fica)
Especı́ficas para un objeto
Valores demasiado altos generan problemas (i.e. quedarnos sin
memoria)
Introducción
El proceso debe ser el siguiente:
Preparar y realizar mediciones de prueba antes de empezar a ajustar
servidor
Pruebas que representen carga de trabajo real
Incluir consultas complejas
Definir un sistema de supervisión para medir si cambio mejora o
empeora rendimiento
Cambiar una o dos variables, un poco, cada vez, y hacer prueba de
medición
Ajustar hasta que todo funciona “bastante bien”
No insistir a menos que creamos que podemos obtener mejora
significativa (el esfuerzo no compensa)
Los “acantilados” son tı́picos: incrementamos variable un poco y
mejora rendimiento; la incrementamos un poco más, y el
rendimiento cae en picado
Introducción
No comenzar a ajustar configuración sin un esquema y consultas
estables
Todos los ı́ndices creados
Si modificamos esquema después de ajustar configuración: volver a
empezar
Describiremos estos aspectos
Ajuste de uso de memoria
Ajustes de cachés
Ajustes E/S
Concurrencia
100-
((key_blocks_unused*key_cache_block_size)*100/key_buffer_size)
% de aciertos:
100-((key_reads*100)/key_read_requests)
Fallos por segundo:
key_reads/uptime
El % aciertos es el menos significativo porque depende mucho de la
aplicación
El número de fallos por segundo es el más significativo
El % buffer en uso permite conocer si hemos reservado demasiado
espacio
Aunque no se usen tablas MyISAM hay que reservar espacio a la
cache porque MySQL las usa para ciertas operaciones
Enxeñarı́a Informática Miguel R. Luaces (luaces@udc.es) - Juan Ramón López Rodrı́guez
BD3: Diseño Fı́sico - MySQL
Optimización
Optimización del servidor
Caché de subprocesos
Pool de procesos libres preparada para conexiones nuevas
Entra conexión: se le asigna proceso de la caché
Conexión se cierra: proceso vuelve a estar disponible en la caché
Si no hay sitio: el proceso se destruye
Número máximo de subprocesos en cache: thread_cache_size
Monitorización:
Intentar mantener threads_created entre 1-10 por segundo
Revisar threads_connected para configurar el tamaño de la cache
de forma que sea capaz de contener la fluctuación tı́pica de la carga
de trabajo
Concurrencia
InnoDB antes de MySQL 5.1 responde mal a situaciones de alta
concurrencia
Única solución: limitar concurrencia
(innodb_thread_concurrency)
Formula útil (en la práctica, puede ser mejor usar valor más
pequeño):
concurrencia = num CPUs * num discos * 2
Antes, InnoDB tenı́a muchos semáforos MUTEX
Ahora la concurrencia es mucho mejor en InnoDB, pero la mejora de
la caché de threads quedó la rama abandonada de MySQL 6.0 y se
ha recuperado en MariaDB
Miguel R. Luaces
Laboratorio de Bases de Datos
Universidade da Coruña