Bienvenidos a "Optimizacin del rendimiento con MySQL". Soy Vctor Jimnez y ser vuestro ponente para hoy.
Trabajo en Warp Networks S.L. http://www.warp.es Donde nos dedicamos a varias cosas, entre ellas, formacin y consultora MySQL
Trabajo en Warp Networks S.L. http://www.warp.es Donde nos dedicamos a varias cosas, entre ellas, formacin y consultora MySQL
Agenda
5"
20"
30"
4- Ejercicios
40"
5- Ruegos y Preguntas
Desarrollamos nuestras apps web sin importarnos mucho el rendimiento. Cuando nuestra web tiene xito y se convierte en la gallina de los huevos de oro, tenemos ms solicitudes, y si no tenemos cuidado
Optimizacin
Optimizacin
Hacer ms con lo mismo
Optimizacin
Hacer ms con lo mismo Objetivo: Aumentar Consultas / segundo
Optimizacin
Hacer ms con lo mismo Objetivo: Aumentar Consultas / segundo Cmo?: Menor tiempo de ejecucin
0s
1s
2s
3s
4s
5s
6s
7s
8s
9s
Tenemos una consulta que tarda 2,5 segundos en ejecutarse si se ejecuta sola. Pero lo normal es que esa consulta se ejecute en varios procesos en paralelo.
0s
1s
2s
3s
4s
5s
6s
7s
8s
9s
Tenemos una consulta que tarda 2,5 segundos en ejecutarse si se ejecuta sola. Pero lo normal es que esa consulta se ejecute en varios procesos en paralelo.
0s
1s
2s
3s
4s
5s
6s
7s
8s
9s
Dado que la mquina tiene ms recursos ocupados, es posible que tarde ms en ejecutarse. En este caso, se ha ejecutado la consulta cinco veces en paralelo, cada una un segundo ms tarde que la anterior.
0s
1s
2s
3s
4s
5s
6s
7s
8s
9s
Dado que la mquina tiene ms recursos ocupados, es posible que tarde ms en ejecutarse. En este caso, se ha ejecutado la consulta cinco veces en paralelo, cada una un segundo ms tarde que la anterior.
C=5
0s
1s
2s
3s
4s
5s
6s
7s
8s
9s
En un momento se estn ejecutando 5 consultas a la vez. El servidor necesita poder soportar estos picos.
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
... slo se ejecuta una consulta cada vez. Reduciendo el nivel de concurrencia que tiene que soportar el servidor.
0s
1s
2s
3s
4s
5s
6s
7s
8s
9s
Ms informacin
http://www.slideshare.net/capitangolo/no-mueras-de-exito
2 - Arquitectura MySQL
3- Optimizacin de consultas 4- Ejercicios 5- Ruegos y Preguntas
2 - Arquitectura MySQL
mysqld mysqld-nt
MySQL tiene una arquitectura cliente servidor. Aunque hay algunos programas 'ninjas' que acceden directamente a los datos.
2 - Arquitectura MySQL
mysqld mysqld-nt
myisamchk myisampack
MySQL tiene una arquitectura cliente servidor. Aunque hay algunos programas 'ninjas' que acceden directamente a los datos.
2 - Arquitectura MySQL
2 - Arquitectura MySQL
Uso de Memoria
Thread Cache Buffers y Cachs 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 Sesin
Reservado por cada conexin Principalmente para gestionar los resultados sort_buffer join_buffer read_buffer
Hay que tener cuidado al congurar las variables de sesin. 20MB de sort_buffer x 100 conexiones = 2GB de memoria
2 - Arquitectura MySQL
API C Intrprete Query Optimizador Cache Executador Motores MyISAM Memory InnoDB CSV
Subsistemas Funciones base Hilos Buffers y cachs Red Logs Acceso y Permisos
2 - Arquitectura MySQL
Motores de Almacenamiento
Gestionan la persistencia y recuperacin de los datos Configuracin a nivel de Tabla Oficiales:
MyISAM Motor por defecto en MySQL 5.0 InnoDB Motor por defecto en MySQL 5.5 Memory Archive Blackhole CSV
De terceros:
solidDB InfoBrigth Nitro PBXT
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)
0s
1s
2s
3s
4s
5s
6s
7s
8s
9s
Los select obtienen bloqueo de lectura compartido. El insert solicita un bloqueo exclusivo de escritura. Todos los dems selects posteriores esperan a que el insert libere el bloqueo. Hasta que el primer select termina, no se terminan de ejecutar las dems consultas. LLegamos a tener concurrencia 7!!!
0s
1s
2s
3s
4s
5s
6s
7s
8s
9s
Los select obtienen bloqueo de lectura compartido. El insert solicita un bloqueo exclusivo de escritura. Todos los dems selects posteriores esperan a que el insert libere el bloqueo. Hasta que el primer select termina, no se terminan de ejecutar las dems consultas. LLegamos a tener concurrencia 7!!!
0s
1s
2s
3s
4s
5s
6s
7s
8s
9s
Los select obtienen bloqueo de lectura compartido. El insert solicita un bloqueo exclusivo de escritura. Todos los dems selects posteriores esperan a que el insert libere el bloqueo. Hasta que el primer select termina, no se terminan de ejecutar las dems consultas. LLegamos a tener concurrencia 7!!!
0s
1s
2s
3s
4s
5s
6s
7s
8s
9s
Los select obtienen bloqueo de lectura compartido. El insert solicita un bloqueo exclusivo de escritura. Todos los dems selects posteriores esperan a que el insert libere el bloqueo. Hasta que el primer select termina, no se terminan de ejecutar las dems consultas. LLegamos a tener concurrencia 7!!!
0s
1s
2s
3s
4s
5s
6s
7s
8s
9s
Key Cache
Cach para ndices MyISAM key_buffer_size > 0
InnoDB guarda toda la informacin de todas las tablas en el tablespace. Archivo ibdata
Si conguramos innodb_le_per_table tenemos un sub-espacio de tabla por cada tabla Archivo .ibd El espacio de tabla sigue conteniendo informacin de cada tabla, es necesario.
MYSQL SERVER
BUFFER POOL
checkpoints
ib_logfiles
ibdata
innodb_buffer_pool_size
80% de la memoria Cuanto ms grande, ms datos se cachean
innodb_log_buffer_size
Un mayor tamao permite que las transacciones grandes no tengan que escribir a disco.
innodb_log_file_size
Un mayor tamao de logfile:
reduce el tiempo entre checkpoints aumenta el tiempo de recuperacin
ndices InnoDB
PK Index
PK
PK
PK
Index
Index
Index
PK
Index
En InnoDB, la clave primaria direcciona directamente a la tabla. El resto de claves, direccionan a la clave primaria. El resto de claves tambin incluyen la clave primaria.
ndices InnoDB
PK Index
PK
PK
PK
Index
Index
Index
PK
Index
En InnoDB, la clave primaria direcciona directamente a la tabla. El resto de claves, direccionan a la clave primaria. El resto de claves tambin incluyen la clave primaria.
ndices InnoDB
PK Index
PK
PK
PK
Index
Index
Index
PK
Index
En InnoDB, la clave primaria direcciona directamente a la tabla. El resto de claves, direccionan a la clave primaria. El resto de claves tambin incluyen la clave primaria.
3 - Optimizacin de consultas
4- Ejercicios 5- Ruegos y Preguntas
MySQL server
Query Cache Parse Optimization Execution MyISAM InnoDB Memory
Tablas
Si activamos la Query Cache, la primera vez que ejecutemos la consulta seguir los mismos pasos. Con un paso adicional, a la vez que se devuelven los datos al usuario, se guarda una copia en la cach de consultas.
SELECT result
MySQL server
Query Cache Parse Optimization Execution MyISAM InnoDB Memory
Tablas
Si activamos la Query Cache, la primera vez que ejecutemos la consulta seguir los mismos pasos. Con un paso adicional, a la vez que se devuelven los datos al usuario, se guarda una copia en la cach de consultas.
SELECT result
MySQL server
Query Cache Parse Optimization Execution MyISAM InnoDB Memory SELECT result
Tablas
Si activamos la Query Cache, la primera vez que ejecutemos la consulta seguir los mismos pasos. Con un paso adicional, a la vez que se devuelven los datos al usuario, se guarda una copia en la cach de consultas.
MySQL server
Query Cache Parse Optimization Execution MyISAM InnoDB Memory SELECT result
Tablas
La prxima vez que se ejecute la misma consulta, se obtendrn los datos dirctamente de la cache. Lo que es un proceso casi instantneo.
SELECT result
MySQL server
Query Cache Parse Optimization Execution MyISAM InnoDB Memory SELECT result
Tablas
La prxima vez que se ejecute la misma consulta, se obtendrn los datos dirctamente de la cache. Lo que es un proceso casi instantneo.
MySQL server
Query Cache Parse Optimization Execution MyISAM InnoDB Memory SELECT result
Tablas
Estos datos estn siempre actualizados? S, porque si se modican los datos subyacentes, la cach se limpia.
UPDATE
MySQL server
Query Cache Parse Optimization Execution MyISAM InnoDB Memory
Tablas
Estos datos estn siempre actualizados? S, porque si se modican los datos subyacentes, la cach se limpia.
MySQL server
Query Cache Parse Optimization Execution MyISAM InnoDB Memory
Tablas
Estos datos estn siempre actualizados? S, porque si se modican los datos subyacentes, la cach se limpia.
| Qcache_queries_in_cache | 173
+-------------------------+---------+
| Qcache_queries_in_cache | 173
+-------------------------+---------+
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
$ mysqlslap -i 10 -c 2 --create-schema=test -q test.sql Benchmark Average number of seconds to run all queries: 51.776 seconds Minimum number of seconds to run all queries: 51.776 seconds Maximum number of seconds to run all queries: 51.776 seconds Number of clients running queries: 2 Average number of queries per client: 239 $ mysqlslap -i 10 -c 2 --create-schema=test -q test.sql --csv=test.csv $ cat test.csv ,mixed,51.776,51.776,51.776,2,239
salida de mysqlslap
$ mysqlslap -i 10 -c 2 --create-schema=test -q test.sql Benchmark Average number of seconds to run all queries: 51.776 seconds Minimum number of seconds to run all queries: 51.776 seconds Maximum number of seconds to run all queries: 51.776 seconds Number of clients running queries: 2 Average number of queries per client: 239 $ mysqlslap -i 10 -c 2 --create-schema=test -q test.sql --csv=test.csv $ cat test.csv ,mixed,51.776,51.776,51.776,2,239
Consultas
similares a las de produccin suficiente cantidad claves desordenadas
Servidor MySQL
Exclusivo para el test
Resultados
Leer con cuidado
Podemos crear tablas grandes insertando los datos de esa misma tabla en s misma.
SQL
$ mysql world -N --batch -e \ "SELECT CONCAT( 'SELECT ID FROM CityHuge WHERE CountryCode=\"', code, '\";') FROM Country" > test.sql
4,5
1,5
El test D tarda 3 veces ms!! No hay que jarse en el valor absoluto, en produccin no tardar eso. Hay que jarse en el porcentaje de mejora entre una opcin y otra.
EXPLAIN
EXPLAIN SELECT id FROM City WHERE Population > 1000000\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: City type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 4079 Extra: Using where
ALTER TABLE City ADD INDEX (Population); ALTER TABLE City ADD INDEX `pop_code`(Population, CountryCode); EXPLAIN SELECT FROM Name City
WHERE CountryCode = 'ESP' AND Population > 1000000\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: City type: range possible_keys: Population,pop_code key: Population key_len: 4 ref: NULL rows: 238 Extra: Using where
ALTER TABLE City ADD INDEX (Population); ALTER TABLE City ADD INDEX `pop_code`(Population, CountryCode); EXPLAIN SELECT FROM Name City
WHERE CountryCode = 'ESP' AND Population > 1000000\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: City type: range possible_keys: Population,pop_code key: Population key_len: 4 ref: NULL rows: 238 Extra: Using where
ALTER TABLE City ADD INDEX (Population); ALTER TABLE City ADD INDEX `pop_code`(Population, CountryCode); EXPLAIN SELECT FROM Name City
WHERE CountryCode = 'ESP' AND Population > 1000000\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: City type: range possible_keys: Population,pop_code key: Population key_len: 4 ref: NULL rows: 238 Extra: Using where
ALTER TABLE City ADD INDEX (Population); ALTER TABLE City ADD INDEX `pop_code`(Population, CountryCode); EXPLAIN SELECT FROM Name City
WHERE CountryCode = 'ESP' AND Population > 1000000\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: City type: range possible_keys: Population,pop_code key: Population key_len: 4 ref: NULL rows: 238 Extra: Using where
WHERE ID = '345'\G ******** 1. row id: 1 select_type: SIMPLE table: City type: const possible_keys: PRIMARY key: PRIMARY key_len: 4 ref: const rows: 1 Extra:
WHERE ID = '345'\G ******** 1. row id: 1 select_type: SIMPLE table: City type: const possible_keys: PRIMARY key: PRIMARY key_len: 4 ref: const rows: 1 Extra: Using index
WHERE ID = '345'\G ******** 1. row id: 1 select_type: SIMPLE table: City type: const possible_keys: PRIMARY key: PRIMARY key_len: 4 ref: const rows: 1 Extra:
WHERE ID = '345'\G ******** 1. row id: 1 select_type: SIMPLE table: City type: const possible_keys: PRIMARY key: PRIMARY key_len: 4 ref: const rows: 1 Extra: Using index
Seleccionar slo las columnas necesarias permite que: A veces los datos puedan leerse slo de los ndices (memoria). Se lean menos datos de disco en el resto de casos.
c
112,5
i 5 5 5 5
1 2
75,0
4 8
37,5
2 COUNT(id)
4 COUNT(*)
En este caso, lo que ocurre es que COUNT(id) cuenta el nmero de las cuyo id es != NULL. Para ello tiene que comprobar valor a valor.
3 - Optimizacin de consultas EXPLAIN EXPLAIN SELECT FROM City.Name, Country.Name City, Country
WHERE Country.Code = City.CountryCode AND Country.Name="Spain"\G *********** 1. row id: 1 select_type: SIMPLE table: City type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 4079 Extra: ********** *********** 2. row id: 1 select_type: SIMPLE table: Country type: eq_ref possible_keys: PRIMARY key: PRIMARY key_len: 3 ref: world.City.CountryCode rows: 1 Extra: Using where **********
3 - Optimizacin de consultas EXPLAIN EXPLAIN SELECT FROM City.Name, Country.Name City, Country
WHERE Country.Code = City.CountryCode AND Country.Name="Spain"\G *********** 1. row id: 1 select_type: SIMPLE table: City type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 4079 Extra: ********** *********** 2. row id: 1 select_type: SIMPLE table: Country type: eq_ref possible_keys: PRIMARY key: PRIMARY key_len: 3 ref: world.City.CountryCode rows: 1 Extra: Using where **********
3 - Optimizacin de consultas EXPLAIN EXPLAIN SELECT FROM City.Name, Country.Name City, Country
WHERE Country.Code = City.CountryCode AND Country.Code="ESP"\G *********** 1. row id: 1 select_type: SIMPLE table: Country type: const possible_keys: PRIMARY key: PRIMARY key_len: 3 ref: const rows: 1 Extra: ********** *********** 2. row id: 1 select_type: SIMPLE table: City type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 4079 Extra: Using where **********
3 - Optimizacin de consultas EXPLAIN EXPLAIN SELECT FROM City.Name, Country.Name City, Country
WHERE Country.Code = City.CountryCode AND Country.Code="ESP"\G *********** 1. row id: 1 select_type: SIMPLE table: Country type: const possible_keys: PRIMARY key: PRIMARY key_len: 3 ref: const rows: 1 Extra: ********** *********** 2. row id: 1 select_type: SIMPLE table: City type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 4079 Extra: Using where **********
Forzar ndices
USE INDEX (ndices) IGNORE INDEX (ndices) FORCE INDEX (ndices)
STRAIGHT_JOIN
fuerza a que un JOIN se construya en el orden en el que se ha declarado
ANALYZE TABLE
Actualiza las estadsticas de una tabla Ejecutado peridicamente ayuda al optimizador
Ejemplo
EXPLAIN SELECT City.Name, Country.Name FROM City, Country WHERE Country.Code = City.CountryCode AND Country.Code = "ESP";
I Formatear
EXPLAIN SELECT City.Name, Country.Name FROM City, Country WHERE Country.Code = City.CountryCode AND Country.Code = "ESP";
City
Country
City
Country
City
CountryCode Code
Country
City
CountryCode Code
Country
City
CountryCode Code
Country
Code = "ESP"
City
CountryCode Code Name
Country
Code = "ESP" Name
IV Aadir ndices
SELECT City.Name, Country.Name FROM City, Country WHERE Country.Code = City.CountryCode AND Country.Code = "ESP";
City
CountryCode
PK PK
Country
Code = "ESP" Name Code
Name
SELECT
City.Name, Country.Name
City
CountryCode
PK PK
Country
Code = "ESP" Name Code
FROM
City, Country
Name
SELECT
City.Name, Country.Name
City
CountryCode
PK PK
Country
Code = "ESP" Name Code
FROM
City, Country
Name
SELECT
City.Name, Country.Name
City
CountryCode
PK PK
Country
Code = "ESP" Name Code
FROM
City, Country
Name
SELECT
City.Name, Country.Name
City
CountryCode
PK PK
Country
Code = "ESP" Name Code
FROM
City, Country
Name
SELECT
City.Name, Country.Name
City
CountryCode
PK PK
Country
Code = "ESP" Name Code
FROM
City, Country
Name
table: Country type: const key: PRIMARY rows: 1 Extra: *********** 2. row table: City type: ALL key: NULL rows: 4079 Extra: Using where PK **********
City
CountryCode Code
PK
Country
Code = "ESP" Name
Name
Plan B Country City Seleccionar Code = "ESP" de Country usando PK Por cada registro en Country (1): Recorre secuencialmente City Seleccionar la fila slo si CountryCode = Code De las filas seleccionadas, leer: City.Name (de la tabla) Country.Name (de la tabla)
table: Country type: const key: PRIMARY rows: 1 Extra: *********** 2. row table: City type: ALL key: NULL rows: 4079 Extra: Using where **********
City
CountryCode
PK PK
Country
Code = "ESP" Name Code
Name
Condiciones WHERE
Country
PK
Se deben escribir sobre columnas indexadas, o Crear un ndice que contenga al resto de columnas
PK Code
Columnas SELECT
Seleccionar slo las necesarias Si todas son parte del ndice mejora el rendimiento
CountryCode
City
Name
Condiciones WHERE
Country
PK
Se deben escribir sobre columnas indexadas, o Crear un ndice que contenga al resto de columnas
PK Code
Columnas SELECT
Seleccionar slo las necesarias Si todas son parte del ndice mejora el rendimiento
CountryCode
City
Name
VIII Adaptar
Para que MySQL siga nuestro plan:
Asegurarnos de que hemos creado los ndices ANALIZE TABLE FORCE | IGNORE INDEX Reescribir la consulta
WHERE Condiciones JOIN
Consultas no correlativas
EXPLAIN SELECT Name FROM City
WHERE City.ID IN ( SELECT Capital FROM Country WHERE Country.Continent = 'Europe' )\G ************* 1. row ************* id: 1 select_type: PRIMARY table: City type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 4079 Extra: Using where ************** 2. row ************** id: 2 select_type: DEPENDENT SUBQUERY table: Country type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 239 Extra: Using where
Las subconsultas no correlativas son aquellas que se pueden ejecutar de manera independiente a la consulta principal.
Consultas no correlativas
EXPLAIN SELECT Name FROM City, ( SELECT ) co WHERE City.ID = co.Capital\G ******* 1. row ******* id: 1 select_type: PRIMARY table: <derived2> type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 46 Extra: ******* 2. row ******* id: 1 select_type: PRIMARY table: City type: eq_ref possible_keys: PRIMARY key: PRIMARY key_len: 4 ref: co.Capital rows: 1 Extra: ******* 3. row ******* id: 2 select_type: DERIVED table: Country type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 239 ... Capital FROM Country WHERE Country.Continent = 'Europe'
Las subconsultas no correlativas se pueden situar como una tabla con la que hacer JOIN
Consultas no correlativas
EXPLAIN SELECT FROM Name City, Country
WHERE City.ID = Country.Capital AND Country.Continent = 'Europe'\G ************* 1. row ************* id: 1 select_type: SIMPLE table: Country type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 239 Extra: Using where ************** 2. row ************** id: 1 select_type: SIMPLE table: City type: eq_ref possible_keys: PRIMARY key: PRIMARY key_len: 4 ref: world.Country.Capital rows: 1 Extra:
Funciones de agregacin
SELECT FROM Name, Population Country, (SELECT MAX(Population) max_pop FROM Country) co WHERE Country.Population = co.max_pop;
Condiciones OR
SELECT FROM ci.Name 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%');
Las condiciones OR sobre campos de varias tablas no permite que se puedan usar ndices.
Condiciones OR
ALTER TABLE City ADD INDEX (CountryCode), ADD INDEX (Name); ALTER TABLE CountryLanguage ADD INDEX (Language); SELECT ci.Name FROM City ci, ( SELECT ID FROM City ci, Country co, CountryLanguage cl
WHERE ci.CountryCode = co.Code AND co.Code = cl.CountryCode AND cl.Language LIKE 'Es%' UNION SELECT ID FROM City ci
City Name
Si vamos a consultar muchas veces las ciudades por continente, nos puede interesar desnormalizar creando una tabla cach que relacione directamente las ciudades con sus continentes.
City Name
Si vamos a consultar muchas veces las ciudades por continente, nos puede interesar desnormalizar creando una tabla cach que relacione directamente las ciudades con sus continentes.
City Name
Si vamos a consultar muchas veces las ciudades por continente, nos puede interesar desnormalizar creando una tabla cach que relacione directamente las ciudades con sus continentes.
MySQL 5.5
Source: http://datacharmer.blogspot.com/2009/04/mysql-54-performance-with-logging.html
MySQL 5.5
x 1.59
MySQL 5.5
Particionado
http://www.slideshare.net/datacharmer/mysql-partitions
Triggers
Cdigo que se ejecuta: ANTES DESPUS de INSERTAR MODIFICAR BORRAR
Triggers
Hasta 6 triggers por tabla Sintaxis:
CREATE TABLE account (acct_num INT, amount DECIMAL(10,2)); CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount;
Triggers
Auditora Forzar Integridad Mantener cachs
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
4.- Ejercicios
5- Ruegos y Preguntas
Ejercicio I
> SELECT Name FROM City WHERE Name = 'Madrid'; > SELECT Name FROM City WHERE Name Like 'Madrid%';
$ mysql world -NB -e "SELECT CONCAT('SELECT Name FROM City WHERE Name = \'', Name ,'\';') FROM City;" > test_equal.sql $ mysql world -NB -e "SELECT CONCAT('SELECT Name FROM City WHERE Name LIKE \'', Name ,'%\';') FROM City;" > test_like.sql
Ejercicio II
> SELECT Name FROM city WHERE Population BETWEEN 20000 AND 30000;
> CREATE TABLE City2 LIKE City; > INSERT INTO City2 SELECT * FROM City; > INSERT INTO City2 SELECT Null, CONCAT(Name,'1'), CountryCode, District, Population * 0.95 FROM City2;
> SELECT Name FROM City2 WHERE Population BETWEEN 20000 AND 30000; > ALTER TABLE City2 ADD INDEX(Population, Name); > SELECT Name FROM City2 WHERE Population BETWEEN 20000 AND 30000;
Ejercicio III
SELECT FROM SUM(salary) salaries
Ejercicio IV
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 (solucin)
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 V
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();
!
Curso MySQL Performance Tuning
Del 2 al 5 de Junio training@warp.es
!
Gracias!
Bienvenidos a "Optimizacin del rendimiento con MySQL". Soy Vctor Jimnez y ser vuestro ponente para hoy.