Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Optimizar MySQL PDF
Optimizar MySQL PDF
20"
2- Arquitectura de MySQL
3- Optimización de consultas
30"
4- Ejercicios
40"
5- Ruegos y Preguntas
…
1 - Introducción ¿Por Qué
optimizar?
2- Arquitectura de MySQL
3- Optimización de consultas
4- Ejercicios
5- Ruegos y Preguntas
1 - Introducción ¿Por Qué optimizar?
Optimización
1 - Introducción ¿Por Qué optimizar?
Optimización
Hacer más con lo mismo
1 - Introducción ¿Por Qué optimizar?
Optimización
Hacer más con lo mismo
Objetivo: Aumentar Consultas / segundo
1 - Introducción ¿Por Qué optimizar?
Optimización
Hacer más con lo mismo
Objetivo: Aumentar Consultas / segundo
¿Cómo?: Menor tiempo de ejecución
1 - Introducción ¿Por Qué optimizar?
0s 1s 2s 3s 4s 5s 6s 7s 8s 9s
0s 1s 2s 3s 4s 5s 6s 7s 8s 9s
0s 1s 2s 3s 4s 5s 6s 7s 8s 9s
Dado que la máquina tiene más recursos ocupados, es posible que tarde
más en ejecutarse.
En este caso, se ha ejecutado la consulta cinco veces en paralelo, cada
una un segundo más tarde que la anterior.
1 - Introducción ¿Por Qué optimizar?
0s 1s 2s 3s 4s 5s 6s 7s 8s 9s
Dado que la máquina tiene más recursos ocupados, es posible que tarde
más en ejecutarse.
En este caso, se ha ejecutado la consulta cinco veces en paralelo, cada
una un segundo más tarde que la anterior.
1 - Introducción ¿Por Qué optimizar?
C=5
0s 1s 2s 3s 4s 5s 6s 7s 8s 9s
C max = 1
0s 1s 2s 3s 4s 5s 6s 7s 8s 9s
C max = 1
0s 1s 2s 3s 4s 5s 6s 7s 8s 9s
0s 1s 2s 3s 4s 5s 6s 7s 8s 9s
Más información
http://www.slideshare.net/capitangolo/no-mueras-de-exito
2 - Arquitectura MySQL
3- Optimización de consultas
4- Ejercicios
5- Ruegos y Preguntas
2 - Arquitectura MySQL
mysqld mysql
mysqld-nt Workbench
PHP My Admin
…
mysqld mysql
mysqld-nt Workbench
PHP My Admin
…
myisamchk
myisampack
/usr/local/mysql/data
test
table.frm
world
City.frm
Country.frm
CountryLanguage.frm
Hostname.pid
Hostname.err
Uso de Memoria
Thread Cache
Buffers y Cachés
Tablas en memoria
Tablas temporales
Buffers de cliente
2 - Arquitectura MySQL
Uso de Memoria
Por Instancia
Reservado en el arranque del servidor
Compartido para todos los usuarios
Query Cache
Key Cache
InnoDB Buffer Pool
Por Sesión
Reservado por cada conexión
Principalmente para gestionar los resultados
sort_buffer
join_buffer
read_buffer
API C Subsistemas
Motores de Almacenamiento
/usr/local/mysql
world
City.frm
City.MYD
City.MYI
No soporta transacciones
Bloqueos a nivel de tabla
Para un backup binario, copiar:
.frm
.MYD
.MYI
Un backup binario es portable
2 - Arquitectura MySQL » MyISAM
Compresión de índices
prefijos en índices de tipo texto
Fulltext
ALTER TABLE table ADD FULLTEXT(column1, column2)
SELECT […] WHERE MATCH (column1, column2) AGAINST ('TEXT');
Concurrent inserts
concurrent_insert = 0 | 1 | 2
R-Tree index
Datos Geoposicionados (GIS)
2 - Arquitectura MySQL » MyISAM
0s 1s 2s 3s 4s 5s 6s 7s 8s 9s
0s 1s 2s 3s 4s 5s 6s 7s 8s 9s
SELECT x FROM …
SELECT …
0s 1s 2s 3s 4s 5s 6s 7s 8s 9s
SELECT x FROM …
SELECT …
0s 1s 2s 3s 4s 5s 6s 7s 8s 9s
SELECT …
SELECT …
INSERT…
SELECT …
SELECT …
SELECT …
SELECT …
SELECT …
0s 1s 2s 3s 4s 5s 6s 7s 8s 9s
Key Cache
key_buffer_size > 0
/usr/local/mysql
test
table.frm
ibdata1
ib_logfile0
ib_logfile1
innodb_file_per_table
/usr/local/mysql
test
table.frm
table.ibd
ibdata1
ib_logfile0
ib_logfile1
Buffer Pool
MYSQL SERVER
Caché de datos e índices
Log Buffer
Log de transacciones
logfiles
BUFFER
Log de transacciones LOG BUFFER
POOL
Redo log
ibdata commit checkpoints
& checkpoints
Diccionario de datos
Undo log
ib_logfiles ibdata
2 - Arquitectura MySQL » InnoDB
innodb_flush_log_at_trx_commit
Controla cómo el commit dispara el flush del log a disco
innodb_buffer_pool_size
80% de la memoria
Cuanto más grande, más datos se cachean
innodb_log_buffer_size
Un mayor tamaño permite que las transacciones grandes no tengan que escribir
a disco.
innodb_log_file_size
Un mayor tamaño de logfile:
reduce el tiempo entre checkpoints
aumenta el tiempo de recuperación
2 - Arquitectura MySQL » InnoDB
Índices InnoDB
PK Index
PK Index
Índices InnoDB
PK Index
PK Index
Índices InnoDB
PK Index
PK Index
3 - Optimización de consultas
4- Ejercicios
5- Ruegos y Preguntas
3 - Optimización de consultas
3.1 - Query Cache
3 - Optimización de consultas » Query Cache
MySQL server
Query Cache
Parse
Optimization
Execution
Tablas
SELECT
result
MySQL server
Query Cache
Parse
Optimization
Execution
Tablas
SELECT
result
MySQL server
SELECT result
Query Cache
Parse
Optimization
Execution
Tablas
MySQL server
SELECT result
Query Cache
Parse
Optimization
Execution
Tablas
SELECT
result
MySQL server
SELECT result
Query Cache
Parse
Optimization
Execution
Tablas
MySQL server
SELECT result
Query Cache
Parse
Optimization
Execution
Tablas
UPDATE
MySQL server
Query Cache
Parse
Optimization
Execution
Tablas
MySQL server
Query Cache
Parse
Optimization
Execution
Tablas
query_cache_type
0 (OFF)
1 (ON) - SELECT SLQ_NO_CACHE
2 (DEMAND) - SELECT SQL_CACHE
query_cache_size
query_cache_limit
query_cache_min_res_unit
3 - Optimización de consultas » Query Cache
mysqlslap
$ mysqlslap [opciones]
opciones:
-i
-c
--create-schema
-q
otras opciones:
--user --password --host --port --socket
ejemplo:
$ mysqlslap -i 10 -c 2 --create-schema=test -q test.sql
salida de mysqlslap
salida de mysqlslap
Datos
similares a los de producción
Consultas
similares a las de producción
suficiente cantidad
claves desordenadas
Servidor MySQL
Exclusivo para el test
Resultados
Leer con cuidado
3 - Optimización de consultas » mysqlslap
Podemos crear tablas grandes insertando los datos de esa misma tabla
en sí misma.
3 - Optimización de consultas » mysqlslap
Logs
general
consultas lentas
Logs
general
consultas lentas
SQL
$ mysql world -N --batch -e \
"SELECT CONCAT(
'SELECT ID FROM CityHuge WHERE CountryCode=\"', code, '\";')
FROM Country" > test.sql
Test A : 5,45 s
6
Test B : 5,95 s
4,5
1,5
0
A B
3 - Optimización de consultas » mysqlslap
A+B+C
D
0 40 80 120 160
EXPLAIN
150,0
c i COUNT(id) COUNT(*)
112,5
1 5 29,974 3,837
2 5 31,862 6,009
37,5
0
1 2 4 8
COUNT(id) COUNT(*)
EXPLAIN
AND Country.Name="Spain"\G
*********** 1. row ********** *********** 2. row **********
id: 1 id: 1
EXPLAIN
AND Country.Name="Spain"\G
*********** 1. row ********** *********** 2. row **********
id: 1 id: 1
EXPLAIN
AND Country.Code="ESP"\G
*********** 1. row ********** *********** 2. row **********
id: 1 id: 1
EXPLAIN
AND Country.Code="ESP"\G
*********** 1. row ********** *********** 2. row **********
id: 1 id: 1
Forzar Índices
STRAIGHT_JOIN
ANALYZE TABLE
Ejemplo
I Formatear
EXPLAIN
SELECT City.Name,
Country.Name
FROM City,
Country
WHERE Country.Code = City.CountryCode
AND Country.Code = "ESP";
Country.Name
FROM City,
Country
Country.Name
City Country
FROM City,
Country
Country.Name
City Country
FROM City,
Country
Country.Name
City Country
FROM City,
CountryCode
Country
Country.Name
City Country
FROM City,
CountryCode
Country
Country.Name
City Country
FROM City,
CountryCode
Country
Code = "ESP"
WHERE Country.Code = City.CountryCode
Code
AND Country.Code = "ESP";
3 - Optimización de consultas » Metodología
Country.Name
City Country
FROM City,
CountryCode
Country
Code = "ESP"
WHERE Country.Code = City.CountryCode
Code
AND Country.Code = "ESP";
Name Name
3 - Optimización de consultas » Metodología
IV Añadir Índices
SELECT City.Name,
Country.Name
City Country
FROM City,
CountryCode
Country PK
Code = "ESP"
WHERE Country.Code = City.CountryCode PK
Code
AND Country.Code = "ESP";
Name Name
3 - Optimización de consultas » Metodología
SELECT City.Name,
Country.Name
City Country
FROM City, CountryCode
PK
Code = "ESP"
Country PK
Code
WHERE Country.Code = City.CountryCode
Name Name
AND Country.Code = "ESP";
3 - Optimización de consultas » Metodología
SELECT City.Name,
Country.Name
City Country
FROM City, CountryCode
PK
Code = "ESP"
Country PK
Code
WHERE Country.Code = City.CountryCode
Name Name
AND Country.Code = "ESP";
3 - Optimización de consultas » Metodología
SELECT City.Name,
Country.Name
City Country
FROM City, CountryCode
PK
Code = "ESP"
Country PK
Code
WHERE Country.Code = City.CountryCode
Name Name
AND Country.Code = "ESP";
3 - Optimización de consultas » Metodología
SELECT City.Name,
Country.Name
City Country
FROM City, CountryCode
PK
Code = "ESP"
Country PK
Code
WHERE Country.Code = City.CountryCode
Name Name
AND Country.Code = "ESP";
3 - Optimización de consultas » Metodología
SELECT City.Name,
Country.Name
City Country
FROM City, CountryCode
PK
Code = "ESP"
Country PK
Code
WHERE Country.Code = City.CountryCode
Name Name
AND Country.Code = "ESP";
3 - Optimización de consultas » Metodología
SELECT City.Name,
Country.Name
FROM City,
Country
table: Country
type: const
key: PRIMARY
rows: 1
key: PRIMARY
rows: 1
¿Mi consulta es
todo lo óptima que podría?
Sí
Terminé de optimizar
No
Optimizar
¿Explain sigue mi
plan de ejecución?
Sí
No
Adaptar
3 - Optimización de consultas » Metodología
FROM City,
Columnas JOIN
Country
Condiciones WHERE
Country Se deben escribir sobre columnas indexadas, o
Crear un índice que contenga al resto de columnas
PK Code = "ESP"
Name
PK Code Columnas SELECT
Seleccionar sólo las necesarias
CountryCode
Si todas son parte del índice mejora el rendimiento
City
Name
Dividir la consulta en trozos más pequeños
Ayuda a saber qué parte tiene peor rendimiento
3 - Optimización de consultas » Metodología
FROM City,
Columnas JOIN
Country
Condiciones WHERE
Country Se deben escribir sobre columnas indexadas, o
Crear un índice que contenga al resto de columnas
PK Code = "ESP"
Name
PK Code Columnas SELECT
Seleccionar sólo las necesarias
CountryCode
Si todas son parte del índice mejora el rendimiento
City
Name
Dividir la consulta en trozos más pequeños
Ayuda a saber qué parte tiene peor rendimiento
3 - Optimización de consultas » Metodología
VIII Adaptar
Consultas no correlativas
EXPLAIN
WHERE City.ID IN (
)\G
************* 1. row ************* ************** 2. row **************
id: 1 id: 2
Consultas no correlativas
EXPLAIN
) co
Consultas no correlativas
EXPLAIN
SELECT Name
id: 1 id: 1
Funciones de agregación
Condiciones OR
SELECT ci.Name
FROM City ci, Country co, CountryLanguage cl
WHERE ci.CountryCode = co.Code
AND co.Code = cl.CountryCode
AND (ci.Name LIKE 'Es%' OR cl.Language LIKE 'Es%');
Condiciones OR
City Country
Name Continent
Name
City_Name
Name Continent Continent
Name Country_Name
City_Name
Name Continent Continent
Name Country_Name
MySQL 5.5
Source:
http://datacharmer.blogspot.com/2009/04/mysql-54-performance-with-logging.html
3 - Optimización de consultas » MySQL 5.5
MySQL 5.5
x 1.59
3 - Optimización de consultas » MySQL 5.5
MySQL 5.5
Particionado
http://www.slideshare.net/datacharmer/mysql-partitions
3 - Optimización de consultas
3.7 - Optimización con MySQL 5.5
3.7.2 - Triggers
3 - Optimización de consultas » Triggers
Triggers
ANTES
DESPUÉS
de
INSERTAR
MODIFICAR
BORRAR
3 - Optimización de consultas » Triggers
Triggers
Triggers
Auditoría
Forzar Integridad
Mantener cachés
3 - Optimización de consultas » Triggers
Coste
A: 15,16 1 Índice
B: 15,20 1 Índice + 1 Trigger
C: 14,87 1 Trigger
15,2
11,4
7,6
3,8
0
A B C
4.- Ejercicios
5- Ruegos y Preguntas
Ejercicio I
"SELECT CONCAT('SELECT Name FROM City WHERE Name = \'', Name ,'\';') FROM
City;" > test_equal.sql
"SELECT CONCAT('SELECT Name FROM City WHERE Name LIKE \'', Name ,'%\';')
FROM City;" > test_like.sql
> SELECT Name FROM city WHERE Population BETWEEN 20000 AND 30000;
FROM City2;
> SELECT Name FROM City2 WHERE Population BETWEEN 20000 AND 30000;
> SELECT Name FROM City2 WHERE Population BETWEEN 20000 AND 30000;
Ejercicio III
SELECT SUM(salary)
FROM salaries
WHERE from_date BETWEEN '1999-01-01' AND '2000-01-01';
Ejercicio III (solución)
SELECT SUM(salary)
FROM salaries
WHERE from_date BETWEEN '1999-01-01' AND '2000-01-01';
SELECT t.title,
AVG(s.salary) salario_medio
FROM titles t,
salaries s
WHERE t.emp_no = s.emp_no
AND t.to_date > NOW()
AND s.to_date > NOW()
GROUP BY t.title
ORDER BY salario_medio DESC;
Ejercicio (solución)
SELECT t.title,
AVG(s.salary) salario_medio
FROM titles t,
salaries s
WHERE t.emp_no = s.emp_no
AND t.to_date > NOW()
AND s.to_date > NOW()
GROUP BY t.title
ORDER BY salario_medio DESC;
SELECT e.first_name,
e.last_name,
s.salary
FROM employees e,
titles t,
salaries s
WHERE e.emp_no = t.emp_no
AND e.emp_no = s.emp_no
AND t.title = 'Manager'
AND t.to_date > NOW()
AND s.to_date > NOW();
1- Introducción. ¿Por qué optimizar?
2- Arquitectura de MySQL
3- Optimización de consultas
4- Ejercicios
Del 2 al 5 de Junio
training@warp.es
!
¡Gracias!
Optimización del rendimiento con MySQL ( deCharlas Mayo 2012)