SlideShare ist ein Scribd-Unternehmen logo
1 von 151
Downloaden Sie, um offline zu lesen
Optimización del rendimiento con MySQL ( LSWC Noviembre 2011)

                 Víctor Jiménez Cerrada <vjimenez@warp.es>
                 @capitangolo
                 http://slideshare.net/capitangolo




Bienvenidos a "Optimización del rendimiento con MySQL".
Soy Víctor Jiménez y seré vuestro ponente para hoy.
Trabajo en Warp Networks S.L. http://www.warp.es
Donde nos dedicamos a varias cosas, entre ellas, formación y consultoría
MySQL
MySQL Training partner since 2006


                          Sun Microsystem Training partner 2009-2010


                          Oracle partner since 2010




Hemos sido partners de MySQL desde 2006
y en esta charla voy a compartir parte de la experiencia que hemos
obtenido desde entonces. Vamos a hablar de optimización del
rendimiento con MySQL
Agenda

  5"     1- Introducción. ¿Por qué optimizar?


 15"     2- Arquitectura de MySQL




 20"     3- Optimización de consultas




  …      4- Ruegos y Preguntas
1 - Introducción ¿Por Qué optimizar?


2- Arquitectura de MySQL
3- Optimización de consultas
4- Ruegos y Preguntas
1 - Introducción ¿Por Qué optimizar?




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 más solicitudes, y si no tenemos cuidado…
1 - Introducción ¿Por Qué optimizar?




… nuestro servidor se cuelga.
A esto se le llama morir de éxito.
1 - Introducción ¿Por Qué optimizar?




                 Pasos para no morir de éxito
                 Optimizar la aplicación
                 Optimizar la base de datos
                 Escalar
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



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.
1 - Introducción ¿Por Qué optimizar?




    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.
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?




    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



En un momento se están ejecutando 5 consultas a la vez.
El servidor necesita poder soportar estos picos.
1 - Introducción ¿Por Qué optimizar?




                                            C max = 1




    0s          1s          2s         3s   4s    5s    6s   7s   8s   9s



Si optimizamos esas consultas para que tarden medio segundo...
1 - Introducción ¿Por Qué optimizar?




                                            C max = 1




    0s          1s          2s         3s   4s    5s    6s   7s   8s   9s



... sólo se ejecuta una consulta cada vez.
Reduciendo el nivel de concurrencia que tiene que soportar el servidor.
1 - Introducción ¿Por Qué optimizar?




    0s          1s          2s         3s   4s   5s   6s   7s   8s   9s



Dejando muchos más recursos libres.
1 - Introducción ¿Por Qué optimizar?




                 Más información

                 http://www.slideshare.net/capitangolo/no-mueras-de-exito




Dejando muchos más recursos libres.
1- Introducción. ¿Por qué optimizar?


2 - Arquitectura MySQL


3- Optimización de consultas
4- Ruegos y Preguntas
2 - Arquitectura MySQL




                 Arquitectura Cliente - Servidor




                          mysqld                   mysql
                          mysqld-nt                Workbench
                                                   PHP My Admin
                                                   …
                         myisamchk
                         myisampack




MySQL tiene una arquitectura cliente servidor.
Aunque hay algunos programas 'ninjas' que acceden directamente a los
datos.
2 - Arquitectura MySQL




                 Uso de Disco


                         /usr/local/mysql

                                  test

                                     table.frm

                                  world


                                         City.frm

                                         Country.frm

                                         CountryLanguage.frm

                                Hostname.pid

                                Hostname.err


En disco guarda tablas, logs y archivos de estado.
2 - Arquitectura MySQL




                 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




Hay que tener cuidado al configurar las variables de sesión.
20MB de sort_buffer x 100 conexiones = 2GB de memoria
2 - Arquitectura MySQL




                 Arquitectura interna


                                  API C             Subsistemas

                                      Intérprete    Funciones base
                         Query
                                                         Hilos
                                     Optimizador
                         Cache
                                                    Buffers y cachés
                                      Executador
                                                          Red
                                 Motores                 Logs
                           MyISAM    InnoDB        Acceso y Permisos
                           Memory         CSV
2 - Arquitectura MySQL




                 Motores de Almacenamiento

                 Gestionan la persistencia y recuperación de los datos
                 Configuración 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      Nitro
                     InfoBrigth   PBXT
2 - Arquitectura MySQL
2.1 - MyISAM
2 - Arquitectura MySQL » MyISAM




                MyISAM

                Características
                Formatos de fila
                Bloqueos
                Key Cache
                Consejos
                Merge
2 - Arquitectura MySQL » MyISAM




                Características de MyISAM (I)


                                  /usr/local/mysql

                                          world


                                             City.frm

                                             City.MYD

                                             City.MYI




MyISAM guarda la información en dos archivos
.MYD(ata) y .MYI(ndex)
2 - Arquitectura MySQL » MyISAM




                Características de MyISAM (II)

                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




                Características de MyISAM (III)

                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




                ¿Cuándo usar MyISAM?

                Aplicaciones de sólo lectura
                Aplicaciones con poca concurrencia
                Búsquedas de texto
                Escaneos de tabla
                Carga masiva de datos
                Almacenamiento masivo de datos (datawarehousing)
2 - Arquitectura MySQL » MyISAM




                ¿Cuándo NO usar MyISAM?

                Almacenamiento Confiable y a prueba de caídas
                Recuperación automática y rápida (HA)
                Alta concurrencia
                Bloqueos prolongados
                Integridad Referencial
                Transacciones
2 - Arquitectura MySQL » MyISAM




                Bloqueos MyISAM (I)

                Bloqueo a nivel de tabla
                Problemático cuando hay concurrencia
2 - Arquitectura MySQL » MyISAM




                Bloqueos MyISAM (II) - Consultas lentas




   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 demás selects posteriores esperan a que el insert libere el
bloqueo.
Hasta que el primer select termina, no se terminan de ejecutar las demás
consultas.
¡¡¡LLegamos a tener concurrencia 7!!!
2 - Arquitectura MySQL » MyISAM




                Bloqueos MyISAM (II) - Consultas lentas

      SELECT x FROM tabla …

                 SELECT x FROM tabla

                       INSERT INTO tabla …

                                             SELECT x FROM tabla …

                                             SELECT x FROM tabla …

                                             SELECT x FROM tabla …

                                                       SELECT x FROM tabla …

                                                               SELECT …



   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 demás selects posteriores esperan a que el insert libere el
bloqueo.
Hasta que el primer select termina, no se terminan de ejecutar las demás
consultas.
¡¡¡LLegamos a tener concurrencia 7!!!
2 - Arquitectura MySQL » MyISAM




                 Bloqueos MyISAM (II) - Consultas lentas

      SELECT …

                 SELECT …

                       INSERT …

                                       SELECT …


                                       SELECT …

                                       SELECT …

                                                  SELECT …

                                                         SELECT …



   0s          1s         2s      3s     4s         5s         6s   7s   8s   9s



Si optimizamos el primer select, los bloqueos bajan exponencialmente.
Concurrencia 4
2 - Arquitectura MySQL » MyISAM




                Bloqueos MyISAM (III) - Soluciones

                concurrent_inserts
                    Las inserciones se realizan al final del archivo de datos.
                SELECT HIGH PRIORITY
                INSERT LOW PRIORITY
                INSERT DELAYED
                    Se almacenan en un buffer, que va insertando cuando la tabla está libre.
2 - Arquitectura MySQL » MyISAM




                Key Cache (I)

                Caché para índices MyISAM


                key_buffer_size > 0




En MyISAM existe una caché de claves
2 - Arquitectura MySQL » MyISAM




                Key Cache (II) - Monitorización

                key_reads / key_read_requests < 1%



                key_blocks_not_flushed

                key_blocks_used

                key_blocks_unused

                key_read_requests

                key_reads

                key_writes_requests

                key_writes




Hay que configurar la caché de claves para que quepan todas las claves
en memoria.
2 - Arquitectura MySQL
2.2 - InnoDB
2 - Arquitectura MySQL » InnoDB




                InnoDB

                Características
                Transacciones
                InnoDB Buffers
                Índices
                Consejos
2 - Arquitectura MySQL » InnoDB




                Características de InnoDB (I): Almacenamiento


                                  /usr/local/mysql

                                         test

                                             table.frm

                                      ibdata1

                                       ib_logfile0

                                      ib_logfile1




InnoDB guarda toda la información de todas las tablas en el tablespace.
Archivo ibdata
2 - Arquitectura MySQL » InnoDB




                Características de InnoDB (II): Files per table

                                                            innodb_file_per_table
                                  /usr/local/mysql

                                         test

                                             table.frm

                                                table.ibd

                                      ibdata1

                                       ib_logfile0

                                      ib_logfile1




Si configuramos innodb_file_per_table tenemos un sub-espacio de tabla
por cada tabla
Archivo .ibd
El espacio de tabla sigue conteniendo información de cada tabla, es
necesario.
2 - Arquitectura MySQL » InnoDB




                Características de InnoDB (III)

                Transacciones full ACID
                Bloqueo a nivel de fila
                     El bloqueo se realiza en la PK
                     Buscando rangos, se bloquean también los huecos
                Bloqueo a nivel de tabla
                Cachea tanto índices como datos
2 - Arquitectura MySQL » InnoDB




                Transacciones (I)

                Atomic
                Consistent
                Isolated
                Durable


                START TRANSACTION

                COMMIT

                ROLLBACK



                AutoCommit = 1
2 - Arquitectura MySQL » InnoDB




                Transacciones (II)

                Isolation Levels:


                     READ UNCOMMITED        + CONCURRENCIA
                     READ COMMITED                                    -
                     REPEATABLE READ        -
                     SERIALIZABLE                         AISLAMIENTO +


                SET TRANSACTION ISOLATION LEVEL READ UNCOMMITED




Podemos configurar el Nivel de aislamiento para mejorar el rendimiento
si no necesitamos tanta integridad en los datos.
2 - Arquitectura MySQL » InnoDB




                InnoDB Buffers (I)

                  Buffer Pool
                                                            MYSQL SERVER
                    Caché de datos e índices
                  Log Buffer
                    Log de transacciones
                  logfiles
                                                      LOG             BUFFER
                     Log de transacciones            BUFFER            POOL
                     Redo log
                  ibdata                          commit      checkpoints
                                            & checkpoints
                    Diccionario de datos
                     Undo log



                                                    ib_logfiles        ibdata
2 - Arquitectura MySQL » InnoDB




                InnoDB Buffers (II): Configuración

                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           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 también incluyen la clave primaria.
2 - Arquitectura MySQL » InnoDB




                Consejos (I)

                Usar claves primarias pequeñas (Enteros)
                Cargar datos ordenados por clave primaria
                Indexar prefijos (No hay compresión de índices)
2 - Arquitectura MySQL » InnoDB




                Consejos (II)

                innodb_additional_mem_pool_size
                innodb_autoextend_increment
                innodb_thread_concurrency


                SHOW ENGINE INNODB STATUS
1- Introducción. ¿Por qué optimizar?
2- Arquitectura de MySQL


3 - Optimización de consultas


4- Ruegos y Preguntas
3 - Optimización de consultas
3.1 - Query Cache
3 - Optimización de consultas » Query Cache




                 Funcionamiento de la Query Cache (I)




                                                                                  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.
3 - Optimización de consultas » Query Cache




                 Funcionamiento de la Query Cache (I)


                        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.
3 - Optimización de consultas » Query Cache




                 Funcionamiento de la Query Cache (I)


                        SELECT

                         result

                                                                                     MySQL server
                                                                            SELECT      result
                                                 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.
3 - Optimización de consultas » Query Cache




                 Funcionamiento de la Query Cache (II)


                        SELECT

                         result

                                                                                     MySQL server
                                                                            SELECT      result
                                                 Query Cache


                                                    Parse

                                                 Optimization

                                                  Execution

                                        MyISAM     InnoDB       Memory

                                                                         Tablas



La próxima vez que se ejecute la misma consulta,
se obtendrán los datos diréctamente de la cache.
Lo que es un proceso casi instantáneo.
3 - Optimización de consultas » Query Cache




                 Funcionamiento de la Query Cache (III)


                       UPDATE




                                                                                  MySQL server

                                                 Query Cache


                                                    Parse

                                                 Optimization

                                                  Execution

                                        MyISAM     InnoDB       Memory

                                                                         Tablas



¿Estos datos están siempre actualizados?
Sí, porque si se modifican los datos subyacentes, la caché se limpia.
3 - Optimización de consultas » Query Cache




                 Configurar la Query Cache

                 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




                 Monitorizar la Query Cache (I)

                 SET GLOBAL query_cache_size = 4 * 1024 * 1024;
                 SHOW GLOBAL STATUS LIKE 'qcache%';
                 +-------------------------+---------+
                 | Variable_name              | Value   |
                 +-------------------------+---------+
                 | Qcache_free_blocks         | 1       |
                 | Qcache_free_memory         | 3555808 |
                 | Qcache_hits                | 460     |
                 | Qcache_inserts             | 173     |
                 | Qcache_lowmem_prunes       | 0       |
                 | Qcache_not_cached          | 37      |
                 | Qcache_queries_in_cache | 173        |
                 | Qcache_total_blocks        | 366     |
                 +-------------------------+---------+
3 - Optimización de consultas » Query Cache




                 Monitorizar la Query Cache (II)

                 SET GLOBAL query_cache_size = 4 * 1024 * 1024;
                 SHOW GLOBAL STATUS LIKE 'qcache%';
                 +-------------------------+---------+
                 | Variable_name              | Value   |
                 +-------------------------+---------+
                 | Qcache_free_blocks         | 1       |
                 | Qcache_free_memory         | 3555808 |
                 | Qcache_hits                | 460     |
                 | Qcache_inserts             | 173     |
                 | Qcache_lowmem_prunes       | 0       |
                 | Qcache_not_cached          | 37      |
                 | Qcache_queries_in_cache | 173        |
                 | Qcache_total_blocks        | 366     |
                 +-------------------------+---------+
3 - Optimización de consultas » Query Cache




                 Monitorizar la Query Cache (III)

                 Uso = Qcache_hits / (Qcache_hits + COM_select)


                 SHOW GLOBAL STATUS LIKE 'Qcache_hits';
                 +---------------+-------+
                 | Variable_name | Value |
                 +---------------+-------+
                 | Qcache_hits          | 460   |
                 +---------------+-------+
                 SHOW GLOBAL STATUS LIKE 'COM_select';
                 +---------------+-------+
                 | Variable_name | Value |
                 +---------------+-------+
                 | Com_select           | 334   |
                 +---------------+-------+
3 - Optimización de consultas
3.2 - mysqlslap
3 - Optimización de consultas » mysqlslap




                 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




mysqlslap permite realizar benchmarking básico de MySQL
3 - Optimización de consultas » mysqlslap




                 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
3 - Optimización de consultas » mysqlslap




                 Preparar una suite de test

                 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




                 Preparar una suite de test: (I) Datos

                 > CREATE TABLE CityHuge LIKE City;
                 > INSERT INTO CityHuge
                       SELECT NULL, Name, CountryCode, District, Population
                          FROM City;
                 > INSERT INTO CityHuge
                      SELECT NULL, Name, CountryCode, District, Population
                          FROM CityHuge;
                 > SELECT COUNT(*) FROM CityHuge;
                 +----------+
                 | COUNT(*) |
                 +----------+
                 |    1044224 |
                 +----------+




Podemos crear tablas grandes insertando los datos de esa misma tabla
en sí misma.
3 - Optimización de consultas » mysqlslap




                 Preparar una suite de test: (II) Consultas

                 Logs
                      general
                      consultas lentas




Podemos hacer suites de test a partir de consultas SQL
3 - Optimización de consultas » mysqlslap




                 Preparar una suite de test: (II) Consultas

                 Logs
                      general
                      consultas lentas

                 SQL
                      $ mysql world -N --batch -e 
                      "SELECT CONCAT(
                                'SELECT ID FROM CityHuge WHERE CountryCode="', code, '";')
                          FROM Country" > test.sql




Podemos hacer suites de test a partir de consultas SQL
3 - Optimización de consultas » mysqlslap




                 Preparar una suite de test: (III) Servidor MySQL

                 Exclusivo para el test
                 Configuración similar a producción
                 Limpiar cachés
                 Desactivar la Query Cache
3 - Optimización de consultas » mysqlslap




                 Preparar una suite de test: (IV) Resultados

                 Una diferencia de un 10% no es representativa


                      Test A : 5,45 s
                                                      6
                      Test B : 5,95 s


                                                     4,5




                                                      3




                                                     1,5




                                                      0
                                                                 A   B
3 - Optimización de consultas » mysqlslap




                 Preparar una suite de test: (V) Resultados

                 En producción se ejecutan consultas de varios tipos mezcladas:
                      Test A (5 selects tabla 1) : 0,11 s
                      Test B (5 selects tabla 2) : 45 s
                      Test C (400 inserts en tablas 1 y 2) : 15 s
                      Test D ( A + B + C intercalados) : 153s

                        A


                        B


                        C


                 A+B+C


                        D

                            0                 40                    80    120     160




El test D tarda ¡¡3 veces más!!
No hay que fijarse en el valor absoluto, en producción no tardará eso.
Hay que fijarse en el porcentaje de mejora entre una opción y otra.
3 - Optimización de consultas
3.3 - EXPLAIN
3 - Optimización de consultas » EXPLAIN




                 EXPLAIN

                 EXPLAIN SELECT id FROM City WHERE Population > 1000000G
                 *************************** 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




Explain informa de cómo va a ejecutar MySQL una consulta.
3 - Optimización de consultas » EXPLAIN


                 ALTER TABLE City ADD INDEX (Population);
                 ALTER TABLE City ADD INDEX `pop_code`(Population, CountryCode);
                 EXPLAIN SELECT           Name
                               FROM       City
                               WHERE CountryCode = 'ESP' AND Population > 1000000G
                 *************************** 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
3 - Optimización de consultas » EXPLAIN


                 ALTER TABLE City ADD INDEX (Population);
                 ALTER TABLE City ADD INDEX `pop_code`(Population, CountryCode);
                 EXPLAIN SELECT           Name
                               FROM       City
                               WHERE CountryCode = 'ESP' AND Population > 1000000G
                 *************************** 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
3 - Optimización de consultas » EXPLAIN


                 ALTER TABLE City ADD INDEX (Population);
                 ALTER TABLE City ADD INDEX `pop_code`(Population, CountryCode);
                 EXPLAIN SELECT           Name
                               FROM       City
                               WHERE CountryCode = 'ESP' AND Population > 1000000G
                 *************************** 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
3 - Optimización de consultas » EXPLAIN


                 ALTER TABLE City ADD INDEX (Population);
                 ALTER TABLE City ADD INDEX `pop_code`(Population, CountryCode);
                 EXPLAIN SELECT           Name
                               FROM       City
                               WHERE CountryCode = 'ESP' AND Population > 1000000G
                 *************************** 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
3 - Optimización de consultas » EXPLAIN


                 > EXPLAIN                                > EXPLAIN
                    SELECT      *                           SELECT     id
                       FROM     City                          FROM     City
                       WHERE ID = '345'G                     WHERE ID = '345'G
                 ******** 1. row            ***********   ******** 1. row       ***********
                                    id: 1                               id: 1
                    select_type: SIMPLE                     select_type: SIMPLE
                              table: City                            table: City
                               type: const                            type: const
                 possible_keys: PRIMARY                   possible_keys: PRIMARY
                                key: PRIMARY                           key: PRIMARY
                         key_len: 4                             key_len: 4
                                ref: const                             ref: const
                               rows: 1                                rows: 1
                              Extra:                                 Extra: Using index
3 - Optimización de consultas » EXPLAIN


                 > EXPLAIN                                > EXPLAIN
                    SELECT      *                           SELECT    id
                       FROM     City                          FROM     City
                       WHERE ID = '345'G                     WHERE ID = '345'G
                 ******** 1. row            ***********   ******** 1. row       ***********
                                    id: 1                               id: 1
                    select_type: SIMPLE                     select_type: SIMPLE
                              table: City                            table: City
                               type: const                            type: const
                 possible_keys: PRIMARY                   possible_keys: PRIMARY
                                key: PRIMARY                           key: PRIMARY
                         key_len: 4                             key_len: 4
                                ref: const                             ref: const
                               rows: 1                                rows: 1
                              Extra:                                 Extra: Using index




Seleccionar sólo las columnas necesarias permite que:
A veces los datos puedan leerse sólo de los índices (memoria).
Se lean menos datos de disco en el resto de casos.
3 - Optimización de consultas » EXPLAIN


                 > EXPLAIN                                    > EXPLAIN
                    SELECT       COUNT(id)                      SELECT    COUNT(*)
                          FROM   City                             FROM    City
                          WHERE CountryCode = 'ESP'G             WHERE CountryCode = 'ESP'G

                  150,0




                  112,5
                                                                c i      COUNT(id)   COUNT(*)


                   75,0                                          1 5        29,974       3,837

                                                                 2 5        31,862       6,009
                   37,5

                                                                 4 5        63,253      10,087

                                                                 8 5       125,721      19,412
                     0
                          1          2               4    8

                                   COUNT(id)   COUNT(*)




En este caso, lo que ocurre es que COUNT(id) cuenta
el número de filas cuyo id es != NULL.
Para ello tiene que comprobar valor a valor.
3 - Optimización de consultas » EXPLAIN


              EXPLAIN

                 SELECT     City.Name, Country.Name

                   FROM     City, Country

                   WHERE Country.Code = City.CountryCode

                      AND Country.Name="Spain"G
              *********** 1. row          **********       *********** 2. row   **********

                             id: 1                                    id: 1

                 select_type: SIMPLE                         select_type: SIMPLE

                          table: City                              table: Country

                           type: ALL                                type: eq_ref

              possible_keys: NULL                          possible_keys: PRIMARY

                            key: NULL                                key: PRIMARY

                      key_len: NULL                              key_len: 3

                            ref: NULL                                ref: world.City.CountryCode

                           rows: 4079                               rows: 1

                          Extra:                                   Extra: Using where




La columna sobre la que se aplican las condiciones es importante.
3 - Optimización de consultas » EXPLAIN


              EXPLAIN

                 SELECT     City.Name, Country.Name

                   FROM     City, Country

                   WHERE Country.Code = City.CountryCode

                      AND Country.Name="Spain"G
              *********** 1. row          **********       *********** 2. row   **********

                             id: 1                                    id: 1

                 select_type: SIMPLE                         select_type: SIMPLE

                          table: City                              table: Country

                           type: ALL                                type: eq_ref

              possible_keys: NULL                          possible_keys: PRIMARY

                            key: NULL                                key: PRIMARY

                      key_len: NULL                              key_len: 3

                            ref: NULL                                ref: world.City.CountryCode

                           rows: 4079                               rows: 1

                          Extra:                                   Extra: Using where




La columna sobre la que se aplican las condiciones es importante.
3 - Optimización de consultas » EXPLAIN


              EXPLAIN

                 SELECT     City.Name, Country.Name

                   FROM     City, Country

                   WHERE Country.Code = City.CountryCode

                      AND Country.Code="ESP"G
              *********** 1. row          **********       *********** 2. row    **********

                             id: 1                                    id: 1

                 select_type: SIMPLE                         select_type: SIMPLE

                          table: Country                           table: City

                           type: const                              type: ALL

              possible_keys: PRIMARY                       possible_keys: NULL

                            key: PRIMARY                             key: NULL

                      key_len: 3                                 key_len: NULL

                            ref: const                               ref: NULL

                           rows: 1                                  rows: 4079

                          Extra:                                   Extra: Using where




La columna sobre la que se aplican las condiciones es importante.
3 - Optimización de consultas » EXPLAIN


              EXPLAIN

                 SELECT     City.Name, Country.Name

                   FROM     City, Country

                   WHERE Country.Code = City.CountryCode

                      AND Country.Code="ESP"G
              *********** 1. row          **********       *********** 2. row    **********

                             id: 1                                    id: 1

                 select_type: SIMPLE                         select_type: SIMPLE

                          table: Country                           table: City

                           type: const                              type: ALL

              possible_keys: PRIMARY                       possible_keys: NULL

                            key: PRIMARY                             key: NULL

                      key_len: 3                                 key_len: NULL

                            ref: const                               ref: NULL

                           rows: 1                                  rows: 4079

                          Extra:                                   Extra: Using where




La columna sobre la que se aplican las condiciones es importante.
3 - Optimización de consultas » EXPLAIN




                 Forzar Índices

                 USE INDEX (índices)
                 IGNORE INDEX (índices)
                 FORCE INDEX (índices)
3 - Optimización de consultas » EXPLAIN




                 STRAIGHT_JOIN

                 fuerza a que un JOIN se construya en el orden en el que se ha declarado
3 - Optimización de consultas » EXPLAIN




                 ANALYZE TABLE

                 Actualiza las estadísticas de una tabla
                 Ejecutado periódicamente ayuda al optimizador
3 - Optimización de consultas
3.4 - Metodología para elegir el
      índice más óptimo
3 - Optimización de consultas » Metodología




                 Metodología para elegir el índice más óptimo
3 - Optimización de consultas » Metodología




                 Metodología para elegir el índice más óptimo

                 Saber qué queremos hacer
3 - Optimización de consultas » Metodología




                 Metodología para elegir el índice más óptimo

                 Saber qué queremos hacer
                 Saber cuál es la manera más óptima
3 - Optimización de consultas » Metodología




                 Metodología para elegir el índice más óptimo

                 Saber qué queremos hacer
                 Saber cuál es la manera más óptima
                 Saber qué hace mysql y por qué
3 - Optimización de consultas » Metodología




                 Metodología para elegir el índice más óptimo

                 Saber qué queremos hacer
                 Saber cuál es la manera más óptima
                 Saber qué hace mysql y por qué
3 - Optimización de consultas » Metodología




                 Metodología para elegir el índice más óptimo

                 Saber qué queremos hacer
                 Saber cuál es la manera más óptima
                 Saber qué hace mysql y por qué


                 MySQL sólo utilizará un índice por tabla
3 - Optimización de consultas » Metodología




                 Metodología para elegir el índice más óptimo

                 Saber qué queremos hacer
                 Saber cuál es la manera más óptima
                 Saber qué hace mysql y por qué


                 MySQL sólo utilizará un índice por tabla
                 MySQL procesará un JOIN realizando el menor número de accesos
3 - Optimización de consultas » Metodología




                 Metodología para elegir el índice más óptimo

                 Saber qué queremos hacer
                 Saber cuál es la manera más óptima
                 Saber qué hace mysql y por qué


                 MySQL sólo utilizará un índice por tabla
                 MySQL procesará un JOIN realizando el menor número de accesos
                      empezando por la tabla con un índice más optimo
3 - Optimización de consultas » Metodología




                 Metodología para elegir el índice más óptimo

                 Saber qué queremos hacer
                 Saber cuál es la manera más óptima
                 Saber qué hace mysql y por qué


                 MySQL sólo utilizará un índice por tabla
                 MySQL procesará un JOIN realizando el menor número de accesos
                      empezando por la tabla con un índice más optimo
                      dictado por las condiciones WHERE
3 - Optimización de consultas » Metodología




                 Metodología para elegir el índice más óptimo

                 Saber qué queremos hacer
                 Saber cuál es la manera más óptima
                 Saber qué hace mysql y por qué


                 MySQL sólo utilizará un índice por tabla
                 MySQL procesará un JOIN realizando el menor número de accesos
                      empezando por la tabla con un índice más optimo
                      dictado por las condiciones WHERE
                      y utilizando claves para seleccionar los registros de otras tablas
3 - Optimización de consultas » Metodología




                 Ejemplo

                 EXPLAIN SELECT City.Name, Country.Name FROM City, Country WHERE
                 Country.Code = City.CountryCode AND Country.Code = "ESP";
3 - Optimización de consultas » Metodología




                 I Formatear

                 EXPLAIN
                 SELECT     City.Name,
                            Country.Name
                    FROM    City,
                            Country
                    WHERE Country.Code = City.CountryCode
                       AND Country.Code = "ESP";




                 Existen Formateadores OnLine:
                 http://www.dpriver.com/pp/sqlformat.htm
3 - Optimización de consultas » Metodología




                   II Dibujar Tablas y Relaciones
SELECT   City.Name,

         Country.Name

  FROM   City,

         Country

  WHERE Country.Code = City.CountryCode

    AND Country.Code = "ESP";
3 - Optimización de consultas » Metodología




                   II Dibujar Tablas y Relaciones
SELECT   City.Name,

         Country.Name

  FROM   City,
                                              City   Country
         Country

  WHERE Country.Code = City.CountryCode

    AND Country.Code = "ESP";
3 - Optimización de consultas » Metodología




                   II Dibujar Tablas y Relaciones
SELECT   City.Name,

         Country.Name

  FROM   City,
                                              City   Country
         Country

  WHERE Country.Code = City.CountryCode

    AND Country.Code = "ESP";
3 - Optimización de consultas » Metodología




                   II Dibujar Tablas y Relaciones
SELECT   City.Name,

         Country.Name

  FROM   City,
                                              City                        Country
                                                     CountryCode
         Country

  WHERE Country.Code = City.CountryCode
                                                                   Code
    AND Country.Code = "ESP";
3 - Optimización de consultas » Metodología




                   III Añadir columnas de SELECT y WHERE
SELECT   City.Name,

         Country.Name

  FROM   City,
                                              City                        Country
                                                     CountryCode
         Country

  WHERE Country.Code = City.CountryCode
                                                                   Code
    AND Country.Code = "ESP";
3 - Optimización de consultas » Metodología




                   III Añadir columnas de SELECT y WHERE
SELECT   City.Name,

         Country.Name

  FROM   City,
                                              City                        Country
                                                     CountryCode
         Country
                                                                          Code = "ESP"
  WHERE Country.Code = City.CountryCode
                                                                   Code
    AND Country.Code = "ESP";
3 - Optimización de consultas » Metodología




                   III Añadir columnas de SELECT y WHERE
SELECT   City.Name,

         Country.Name

  FROM   City,
                                              City                        Country
                                                     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

  FROM   City,
                                              City                          Country
                                                     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




                  V Elegir el mejor plan de actuación




      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




                  V Elegir el mejor plan de actuación
                Plan A
                City » Country
                Recorrer secuencialmente City
                Por cada registro en City (4000):
                       Buscar una equivalencia en Country
                       usando PK
                       Seleccionar la fila sólo si Code = "ESP"
                De las filas seleccionadas, leer:
                       City.Name (de la tabla)
                       Country.Name (de la tabla)



      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




                  V Elegir el mejor plan de actuación
                Plan A                                               Plan B
                City » Country                                       Country » City
                Recorrer secuencialmente City                        Seleccionar Code = "ESP" de Country usando PK
                Por cada registro en City (4000):                    Por cada registro en Country (1):
                       Buscar una equivalencia en Country               Recorre secuencialmente City
                       usando PK                                        Seleccionar la fila sólo si CountryCode = Code
                       Seleccionar la fila sólo si Code = "ESP"      De las filas seleccionadas, leer:
                De las filas seleccionadas, leer:                       City.Name (de la tabla)
                       City.Name (de la tabla)                          Country.Name (de la tabla)
                       Country.Name (de la tabla)



      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




                  V Elegir el mejor plan de actuación
                Plan A                                               Plan B
                City » Country                                       Country » City
                Recorrer secuencialmente City                        Seleccionar Code = "ESP" de Country usando PK
                Por cada registro en City (4000):                    Por cada registro en Country (1):
                       Buscar una equivalencia en Country               Recorre secuencialmente City
                       usando PK                                        Seleccionar la fila sólo si CountryCode = Code
                       Seleccionar la fila sólo si Code = "ESP"      De las filas seleccionadas, leer:
                De las filas seleccionadas, leer:                       City.Name (de la tabla)
                       City.Name (de la tabla)                          Country.Name (de la tabla)
                       Country.Name (de la tabla)



      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




                  V Elegir el mejor plan de actuación
                Plan A                                               Plan B
                City » Country                                       Country » City
                Recorrer secuencialmente City                        Seleccionar Code = "ESP" de Country usando PK
                Por cada registro en City (4000):                    Por cada registro en Country (1):
                       Buscar una equivalencia en Country               Recorre secuencialmente City
                       usando PK                                        Seleccionar la fila sólo si CountryCode = Code
                       Seleccionar la fila sólo si Code = "ESP"      De las filas seleccionadas, leer:
                De las filas seleccionadas, leer:                       City.Name (de la tabla)
                       City.Name (de la tabla)                          Country.Name (de la tabla)
                       Country.Name (de la tabla)



      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




                   V Cotejar con EXPLAIN
      EXPLAIN

      SELECT    City.Name,

                Country.Name

        FROM    City,

                Country

        WHERE Country.Code = City.CountryCode

          AND Country.Code = "ESP";

      *********** 1. row       **********

                table: Country

                 type: const

                  key: PRIMARY

                 rows: 1

                Extra:                          City                          Country
      *********** 2. row       **********              CountryCode
                                                                             PK
                table: City                                                   Code = "ESP"
                                                                     PK
                 type: ALL                                            Code
                  key: NULL                     Name                              Name
                 rows: 4079

                Extra: Using where
3 - Optimización de consultas » Metodología




                   V Cotejar con EXPLAIN
      EXPLAIN                                          Plan B
      SELECT    City.Name,                             Country » City
                Country.Name                           Seleccionar Code = "ESP" de Country usando PK
        FROM    City,                                  Por cada registro en Country (1):
                Country                                   Recorre secuencialmente City
        WHERE Country.Code = City.CountryCode             Seleccionar la fila sólo si CountryCode = Code
          AND Country.Code = "ESP";                    De las filas seleccionadas, leer:
      *********** 1. row       **********                 City.Name (de la tabla)
                table: Country                            Country.Name (de la tabla)
                 type: const

                  key: PRIMARY

                 rows: 1

                Extra:                          City                                        Country
      *********** 2. row       **********                  CountryCode
                                                                                           PK
                table: City                                                                 Code = "ESP"
                                                                             PK
                 type: ALL                                                     Code
                  key: NULL                     Name                                            Name
                 rows: 4079

                Extra: Using where
3 - Optimización de consultas » Metodología




                 VI Optimizar y Adaptar
                                               ¿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




                    VII Optimizar el uso de índices
    SELECT   City.Name,                       ¿Qué columnas añadir a un índice?
             Country.Name

      FROM   City,
                                              Columnas JOIN
             Country

      WHERE Country.Code = City.CountryCode      En la 2ª tabla deben ser la 1ª columna de una clave
        AND Country.Code = "ESP";

                                              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




                    VII Optimizar el uso de índices
    SELECT   City.Name,                       ¿Qué columnas añadir a un índice?
             Country.Name

      FROM   City,
                                              Columnas JOIN
             Country

      WHERE Country.Code = City.CountryCode      En la 2ª tabla deben ser la 1ª columna de una clave
        AND Country.Code = "ESP";

                                              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

                 Para que MySQL siga nuestro plan:
                      Asegurarnos de que hemos creado los índices
                      ANALIZE TABLE
                      FORCE | IGNORE INDEX
                      Reescribir la consulta
                           WHERE
                           Condiciones JOIN
Ejercicio

SELECT   SUM(salary)
  FROM   salaries
  WHERE from_date BETWEEN '1999-01-01' AND '2000-01-01';
Ejercicio

SELECT   SUM(salary)
  FROM   salaries
  WHERE from_date BETWEEN '1999-01-01' AND '2000-01-01';


ALTER TABLE salaries ADD INDEX date_salary(from_date, salary);
Ejercicio

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

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;


ALTER TABLE titles ADD KEY curr_titles(to_date, emp_no, title);
Ejercicio

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;


ALTER TABLE titles ADD KEY to_date(to_date);
PRIMARY (emp_no, title, from_date)
Ejercicio

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();
3 - Optimización de consultas
3.5 - Optimización con Subconsultas
3 - Optimización de consultas » Optimización con subconsultas



                 Consultas no correlativas
                 EXPLAIN

                 SELECT     Name FROM City

                    WHERE City.ID IN (

                                  SELECT Capital FROM Country WHERE Country.Continent = 'Europe'

                 )G
                 ************* 1. row *************             ************** 2. row **************

                                id: 1                                      id: 2

                    select_type: PRIMARY                          select_type: DEPENDENT SUBQUERY

                            table: City                                 table: Country

                             type: ALL                                   type: ALL

                 possible_keys: NULL                            possible_keys: NULL

                              key: NULL                                   key: NULL

                          key_len: NULL                               key_len: NULL

                              ref: NULL                                   ref: NULL

                             rows: 4079                                  rows: 239

                            Extra: Using where                          Extra: Using where




Las subconsultas no correlativas son aquellas que se pueden ejecutar de
manera independiente a la consulta principal.
3 - Optimización de consultas » Optimización con subconsultas



                 Consultas no correlativas
                 EXPLAIN

                 SELECT     Name FROM City, (

                                SELECT    Capital FROM Country WHERE Country.Continent = 'Europe'

                 ) co

                 WHERE City.ID = co.CapitalG
       ******* 1. row *******                ******* 2. row *******         ******* 3. row *******

                      id: 1                                 id: 1                 id: 2

          select_type: PRIMARY                  select_type: PRIMARY          select_type: DERIVED

                  table: <derived2>                     table: City                 table: Country

                   type: ALL                             type: eq_ref                type: ALL

       possible_keys: NULL                   possible_keys: PRIMARY         possible_keys: NULL

                    key: NULL                             key: PRIMARY                   key: NULL

               key_len: NULL                         key_len: 4                   key_len: NULL

                    ref: NULL                             ref: co.Capital                ref: NULL

                   rows: 46                              rows: 1                     rows: 239

                  Extra:                                Extra:                     ...




Las subconsultas no correlativas se pueden situar como una tabla con la
que hacer JOIN
3 - Optimización de consultas » Optimización con subconsultas



                 Consultas no correlativas
                 EXPLAIN

                 SELECT      Name

                    FROM     City, Country

                    WHERE City.ID = Country.Capital

                      AND Country.Continent = 'Europe'G
                 ************* 1. row *************             ************** 2. row **************

                                id: 1                                      id: 1

                    select_type: SIMPLE                           select_type: SIMPLE

                             table: Country                             table: City

                              type: ALL                                  type: eq_ref

                 possible_keys: NULL                            possible_keys: PRIMARY

                               key: NULL                                  key: PRIMARY

                           key_len: NULL                              key_len: 4

                               ref: NULL                                  ref: world.Country.Capital

                              rows: 239                                  rows: 1

                             Extra: Using where                         Extra:




A veces se pueden reescribir como un JOIN
3 - Optimización de consultas » Optimización con subconsultas




                 Funciones de agregación

                 SELECT      Name, Population
                    FROM     Country,
                             (SELECT MAX(Population) max_pop FROM Country) co
                    WHERE Country.Population = co.max_pop;




Y otras, como cuando se usan funciones de agregación, no.
3 - Optimización de consultas » Optimización con subconsultas




                 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%');




Las condiciones OR sobre campos de varias tablas no permite que se
puedan usar índices.
3 - Optimización de consultas » Optimización con subconsultas




                 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
                                    WHERE ci.Name LIKE 'Es%'
                           ) ci_ids
                    WHERE ci.ID = ci_ids.ID;




Se puede reescribir como subconsultas para ayudar a MySQL.
3 - Optimización de consultas
3.6 - Optimización usando cachés
      propias
3 - Optimización de consultas » Optimización usando cachés propias




                 Cachés propias


                       City                    Country


                     Name                    Continent
                                              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.
3 - Optimización de consultas » Optimización usando cachés propias




                 Cachés propias


                       City                    Country               City_Country

                                                                      City_Name
                     Name                    Continent                 Continent
                                              Name                   Country_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.
3 - Optimización de consultas » Optimización usando cachés propias




                 Cachés propias


                       City                    Country               City_Country

                                                                      City_Name
                     Name                    Continent                 Continent
                                              Name                   Country_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.
3 - Optimización de consultas
3.7 - Optimización con MySQL 5.5
3 - Optimización de consultas » MySQL 5.5




                 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




Actualizar es un cambio "fácil" de llevar a cabo.
3 - Optimización de consultas
3.7 - Optimización con MySQL 5.5
3.7.1 - Particionado
3 - Optimización de consultas » Particionado




                  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

                  Código que se ejecuta:


                  ANTES
                  DESPUÉS


                  de


                  INSERTAR
                  MODIFICAR
                  BORRAR
3 - Optimización de consultas » Triggers




                  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;
3 - Optimización de consultas » 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




Un trigger apenas afecta al rendimiento en comparación a un índice.
1- Introducción. ¿Por qué optimizar?
2- Arquitectura de MySQL
3- Optimización de consultas



4.- Ruegos y Preguntas
!
¡Gracias!
Optimización del rendimiento con MySQL ( LSWC Noviembre 2011)

Víctor Jiménez Cerrada <vjimenez@warp.es>
@capitangolo
http://slideshare.net/capitangolo

Weitere ähnliche Inhalte

Andere mochten auch

instalacion y conexion a base de datos postgrest /java
instalacion y conexion a base de datos postgrest /javainstalacion y conexion a base de datos postgrest /java
instalacion y conexion a base de datos postgrest /javaNey Rogger Miranda
 
Sistemas gestores de bases de datos
Sistemas gestores de bases de datosSistemas gestores de bases de datos
Sistemas gestores de bases de datosuap
 
La biblia-de-mysql-anaya-multimedia
La biblia-de-mysql-anaya-multimediaLa biblia-de-mysql-anaya-multimedia
La biblia-de-mysql-anaya-multimediaIsrra AguiMor
 
Sistemas de gestión de base de datos
Sistemas de gestión de base de datosSistemas de gestión de base de datos
Sistemas de gestión de base de datosjudithmore16
 
My sql para principiantes
My sql para principiantesMy sql para principiantes
My sql para principiantesMichelle Torres
 
Dba PostgreSQL desde básico a avanzado parte2
Dba PostgreSQL desde básico a avanzado parte2Dba PostgreSQL desde básico a avanzado parte2
Dba PostgreSQL desde básico a avanzado parte2EQ SOFT EIRL
 
Implementacion de bases de datos en mysql
Implementacion de bases de datos en mysqlImplementacion de bases de datos en mysql
Implementacion de bases de datos en mysqlPipe Muñoz
 
Sistemas gestores de base de datos (sgbd)
Sistemas gestores de base de datos (sgbd)Sistemas gestores de base de datos (sgbd)
Sistemas gestores de base de datos (sgbd)Henry Cumbicus Rivera
 

Andere mochten auch (11)

instalacion y conexion a base de datos postgrest /java
instalacion y conexion a base de datos postgrest /javainstalacion y conexion a base de datos postgrest /java
instalacion y conexion a base de datos postgrest /java
 
Postgresql expo
Postgresql expoPostgresql expo
Postgresql expo
 
Sistemas gestores de bases de datos
Sistemas gestores de bases de datosSistemas gestores de bases de datos
Sistemas gestores de bases de datos
 
La biblia-de-mysql-anaya-multimedia
La biblia-de-mysql-anaya-multimediaLa biblia-de-mysql-anaya-multimedia
La biblia-de-mysql-anaya-multimedia
 
Sistemas de gestión de base de datos
Sistemas de gestión de base de datosSistemas de gestión de base de datos
Sistemas de gestión de base de datos
 
My sql para principiantes
My sql para principiantesMy sql para principiantes
My sql para principiantes
 
Dba PostgreSQL desde básico a avanzado parte2
Dba PostgreSQL desde básico a avanzado parte2Dba PostgreSQL desde básico a avanzado parte2
Dba PostgreSQL desde básico a avanzado parte2
 
Implementacion de bases de datos en mysql
Implementacion de bases de datos en mysqlImplementacion de bases de datos en mysql
Implementacion de bases de datos en mysql
 
MYSQL
MYSQLMYSQL
MYSQL
 
Sistemas gestores de base de datos (sgbd)
Sistemas gestores de base de datos (sgbd)Sistemas gestores de base de datos (sgbd)
Sistemas gestores de base de datos (sgbd)
 
Manual curso basico postgres
Manual curso basico postgresManual curso basico postgres
Manual curso basico postgres
 

Ähnlich wie Optimización MySQL con consultas, arquitectura y rendimiento

MySQL de 1995 a 5.5
MySQL de 1995 a 5.5MySQL de 1995 a 5.5
MySQL de 1995 a 5.5juliomacr
 
Oracle Day 2013 ~ MySQL Replication
Oracle Day 2013 ~ MySQL Replication Oracle Day 2013 ~ MySQL Replication
Oracle Day 2013 ~ MySQL Replication Manuel Contreras
 
Alternativas de alta disponiblidad en MySQL - MySQL Meetup - Montevideo - Mar...
Alternativas de alta disponiblidad en MySQL - MySQL Meetup - Montevideo - Mar...Alternativas de alta disponiblidad en MySQL - MySQL Meetup - Montevideo - Mar...
Alternativas de alta disponiblidad en MySQL - MySQL Meetup - Montevideo - Mar...Nelson Calero
 
Rendimiento y optimización de MySQL
Rendimiento y optimización de MySQLRendimiento y optimización de MySQL
Rendimiento y optimización de MySQLbetabeers
 
Web Services buscador de localizaciones de IP’s (Presentación)
Web Services buscador de localizaciones de IP’s (Presentación)Web Services buscador de localizaciones de IP’s (Presentación)
Web Services buscador de localizaciones de IP’s (Presentación)Pablo Pellegrinet
 
Carbura tusql sesion1_slideshare
Carbura tusql sesion1_slideshareCarbura tusql sesion1_slideshare
Carbura tusql sesion1_slideshareJulián Castiblanco
 
Actividad No. 1.14: Replicación de datos en MySQL 5.1
Actividad No. 1.14: Replicación de datos en  MySQL 5.1Actividad No. 1.14: Replicación de datos en  MySQL 5.1
Actividad No. 1.14: Replicación de datos en MySQL 5.1Francisco Medina
 
Cursos de hp ux server2008 sql server itil v3 oracle asterisk softrain
Cursos de hp ux server2008 sql server itil v3 oracle asterisk softrainCursos de hp ux server2008 sql server itil v3 oracle asterisk softrain
Cursos de hp ux server2008 sql server itil v3 oracle asterisk softrainServicios Educativos Softrain C.A.
 
Mysql Administracion
Mysql AdministracionMysql Administracion
Mysql AdministracionIrontec
 
Instalación de MySQL en CentOS 6
Instalación de MySQL en CentOS 6Instalación de MySQL en CentOS 6
Instalación de MySQL en CentOS 6Francisco Medina
 
Curso Infraestructura Hosting y cloud Computing
Curso Infraestructura Hosting y cloud Computing Curso Infraestructura Hosting y cloud Computing
Curso Infraestructura Hosting y cloud Computing Abserver
 

Ähnlich wie Optimización MySQL con consultas, arquitectura y rendimiento (20)

MySQL de 1995 a 5.5
MySQL de 1995 a 5.5MySQL de 1995 a 5.5
MySQL de 1995 a 5.5
 
Oracle Day 2013 ~ MySQL Replication
Oracle Day 2013 ~ MySQL Replication Oracle Day 2013 ~ MySQL Replication
Oracle Day 2013 ~ MySQL Replication
 
My sql clase_1
My sql clase_1My sql clase_1
My sql clase_1
 
Alternativas de alta disponiblidad en MySQL - MySQL Meetup - Montevideo - Mar...
Alternativas de alta disponiblidad en MySQL - MySQL Meetup - Montevideo - Mar...Alternativas de alta disponiblidad en MySQL - MySQL Meetup - Montevideo - Mar...
Alternativas de alta disponiblidad en MySQL - MySQL Meetup - Montevideo - Mar...
 
Rendimiento y optimización de MySQL
Rendimiento y optimización de MySQLRendimiento y optimización de MySQL
Rendimiento y optimización de MySQL
 
My SQL
My SQLMy SQL
My SQL
 
Exposicion Mysql
Exposicion MysqlExposicion Mysql
Exposicion Mysql
 
My SQL
My SQLMy SQL
My SQL
 
Web Services buscador de localizaciones de IP’s (Presentación)
Web Services buscador de localizaciones de IP’s (Presentación)Web Services buscador de localizaciones de IP’s (Presentación)
Web Services buscador de localizaciones de IP’s (Presentación)
 
Carbura tusql sesion1_slideshare
Carbura tusql sesion1_slideshareCarbura tusql sesion1_slideshare
Carbura tusql sesion1_slideshare
 
Mysql
MysqlMysql
Mysql
 
EC2: Cómputo en la nube a profundidad
EC2: Cómputo en la nube a profundidadEC2: Cómputo en la nube a profundidad
EC2: Cómputo en la nube a profundidad
 
Actividad No. 1.14: Replicación de datos en MySQL 5.1
Actividad No. 1.14: Replicación de datos en  MySQL 5.1Actividad No. 1.14: Replicación de datos en  MySQL 5.1
Actividad No. 1.14: Replicación de datos en MySQL 5.1
 
Cursos de hp ux server2008 sql server itil v3 oracle asterisk softrain
Cursos de hp ux server2008 sql server itil v3 oracle asterisk softrainCursos de hp ux server2008 sql server itil v3 oracle asterisk softrain
Cursos de hp ux server2008 sql server itil v3 oracle asterisk softrain
 
Mysql Administracion
Mysql AdministracionMysql Administracion
Mysql Administracion
 
Mysql Administracion
Mysql AdministracionMysql Administracion
Mysql Administracion
 
8. mysql
8. mysql8. mysql
8. mysql
 
Instalación de MySQL en CentOS 6
Instalación de MySQL en CentOS 6Instalación de MySQL en CentOS 6
Instalación de MySQL en CentOS 6
 
Curso Infraestructura Hosting y cloud Computing
Curso Infraestructura Hosting y cloud Computing Curso Infraestructura Hosting y cloud Computing
Curso Infraestructura Hosting y cloud Computing
 
S M B D
S M B DS M B D
S M B D
 

Kürzlich hochgeladen

Excel (1) tecnologia.pdf trabajo Excel taller
Excel  (1) tecnologia.pdf trabajo Excel tallerExcel  (1) tecnologia.pdf trabajo Excel taller
Excel (1) tecnologia.pdf trabajo Excel tallerValentinaTabares11
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxGESTECPERUSAC
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxtjcesar1
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptJavierHerrera662252
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son241514984
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
Los Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesLos Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesEdomar AR
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOnarvaezisabella21
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxazmysanros90
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúCEFERINO DELGADO FLORES
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMidwarHenryLOZAFLORE
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfedepmariaperez
 
tarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzztarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzzAlexandergo5
 

Kürzlich hochgeladen (20)

Excel (1) tecnologia.pdf trabajo Excel taller
Excel  (1) tecnologia.pdf trabajo Excel tallerExcel  (1) tecnologia.pdf trabajo Excel taller
Excel (1) tecnologia.pdf trabajo Excel taller
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptx
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
El uso de las tic en la vida ,lo importante que son
El uso de las tic en la vida ,lo importante  que sonEl uso de las tic en la vida ,lo importante  que son
El uso de las tic en la vida ,lo importante que son
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
Los Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesLos Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, Aplicaciones
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
tics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptxtics en la vida cotidiana prepa en linea modulo 1.pptx
tics en la vida cotidiana prepa en linea modulo 1.pptx
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptx
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdf
 
tarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzztarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzz
 

Optimización MySQL con consultas, arquitectura y rendimiento

  • 1. Optimización del rendimiento con MySQL ( LSWC Noviembre 2011) Víctor Jiménez Cerrada <vjimenez@warp.es> @capitangolo http://slideshare.net/capitangolo Bienvenidos a "Optimización del rendimiento con MySQL". Soy Víctor Jiménez y seré vuestro ponente para hoy.
  • 2. Trabajo en Warp Networks S.L. http://www.warp.es Donde nos dedicamos a varias cosas, entre ellas, formación y consultoría MySQL
  • 3. MySQL Training partner since 2006 Sun Microsystem Training partner 2009-2010 Oracle partner since 2010 Hemos sido partners de MySQL desde 2006 y en esta charla voy a compartir parte de la experiencia que hemos obtenido desde entonces. Vamos a hablar de optimización del rendimiento con MySQL
  • 4. Agenda 5" 1- Introducción. ¿Por qué optimizar? 15" 2- Arquitectura de MySQL 20" 3- Optimización de consultas … 4- Ruegos y Preguntas
  • 5. 1 - Introducción ¿Por Qué optimizar? 2- Arquitectura de MySQL 3- Optimización de consultas 4- Ruegos y Preguntas
  • 6. 1 - Introducción ¿Por Qué optimizar? 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 más solicitudes, y si no tenemos cuidado…
  • 7. 1 - Introducción ¿Por Qué optimizar? … nuestro servidor se cuelga. A esto se le llama morir de éxito.
  • 8. 1 - Introducción ¿Por Qué optimizar? Pasos para no morir de éxito Optimizar la aplicación Optimizar la base de datos Escalar
  • 9. 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
  • 10. 1 - Introducción ¿Por Qué optimizar? 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.
  • 11. 1 - Introducción ¿Por Qué optimizar? 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.
  • 12. 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.
  • 13. 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.
  • 14. 1 - Introducción ¿Por Qué optimizar? C=5 0s 1s 2s 3s 4s 5s 6s 7s 8s 9s En un momento se están ejecutando 5 consultas a la vez. El servidor necesita poder soportar estos picos.
  • 15. 1 - Introducción ¿Por Qué optimizar? C max = 1 0s 1s 2s 3s 4s 5s 6s 7s 8s 9s Si optimizamos esas consultas para que tarden medio segundo...
  • 16. 1 - Introducción ¿Por Qué optimizar? C max = 1 0s 1s 2s 3s 4s 5s 6s 7s 8s 9s ... sólo se ejecuta una consulta cada vez. Reduciendo el nivel de concurrencia que tiene que soportar el servidor.
  • 17. 1 - Introducción ¿Por Qué optimizar? 0s 1s 2s 3s 4s 5s 6s 7s 8s 9s Dejando muchos más recursos libres.
  • 18. 1 - Introducción ¿Por Qué optimizar? Más información http://www.slideshare.net/capitangolo/no-mueras-de-exito Dejando muchos más recursos libres.
  • 19. 1- Introducción. ¿Por qué optimizar? 2 - Arquitectura MySQL 3- Optimización de consultas 4- Ruegos y Preguntas
  • 20. 2 - Arquitectura MySQL Arquitectura Cliente - Servidor mysqld mysql mysqld-nt Workbench PHP My Admin … myisamchk myisampack MySQL tiene una arquitectura cliente servidor. Aunque hay algunos programas 'ninjas' que acceden directamente a los datos.
  • 21. 2 - Arquitectura MySQL Uso de Disco /usr/local/mysql test table.frm world City.frm Country.frm CountryLanguage.frm Hostname.pid Hostname.err En disco guarda tablas, logs y archivos de estado.
  • 22. 2 - Arquitectura MySQL Uso de Memoria Thread Cache Buffers y Cachés Tablas en memoria Tablas temporales Buffers de cliente
  • 23. 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 Hay que tener cuidado al configurar las variables de sesión. 20MB de sort_buffer x 100 conexiones = 2GB de memoria
  • 24. 2 - Arquitectura MySQL Arquitectura interna API C Subsistemas Intérprete Funciones base Query Hilos Optimizador Cache Buffers y cachés Executador Red Motores Logs MyISAM InnoDB Acceso y Permisos Memory CSV
  • 25. 2 - Arquitectura MySQL Motores de Almacenamiento Gestionan la persistencia y recuperación de los datos Configuración 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 Nitro InfoBrigth PBXT
  • 26. 2 - Arquitectura MySQL 2.1 - MyISAM
  • 27. 2 - Arquitectura MySQL » MyISAM MyISAM Características Formatos de fila Bloqueos Key Cache Consejos Merge
  • 28. 2 - Arquitectura MySQL » MyISAM Características de MyISAM (I) /usr/local/mysql world City.frm City.MYD City.MYI MyISAM guarda la información en dos archivos .MYD(ata) y .MYI(ndex)
  • 29. 2 - Arquitectura MySQL » MyISAM Características de MyISAM (II) No soporta transacciones Bloqueos a nivel de tabla Para un backup binario, copiar: .frm .MYD .MYI Un backup binario es portable
  • 30. 2 - Arquitectura MySQL » MyISAM Características de MyISAM (III) 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)
  • 31. 2 - Arquitectura MySQL » MyISAM ¿Cuándo usar MyISAM? Aplicaciones de sólo lectura Aplicaciones con poca concurrencia Búsquedas de texto Escaneos de tabla Carga masiva de datos Almacenamiento masivo de datos (datawarehousing)
  • 32. 2 - Arquitectura MySQL » MyISAM ¿Cuándo NO usar MyISAM? Almacenamiento Confiable y a prueba de caídas Recuperación automática y rápida (HA) Alta concurrencia Bloqueos prolongados Integridad Referencial Transacciones
  • 33. 2 - Arquitectura MySQL » MyISAM Bloqueos MyISAM (I) Bloqueo a nivel de tabla Problemático cuando hay concurrencia
  • 34. 2 - Arquitectura MySQL » MyISAM Bloqueos MyISAM (II) - Consultas lentas 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 demás selects posteriores esperan a que el insert libere el bloqueo. Hasta que el primer select termina, no se terminan de ejecutar las demás consultas. ¡¡¡LLegamos a tener concurrencia 7!!!
  • 35. 2 - Arquitectura MySQL » MyISAM Bloqueos MyISAM (II) - Consultas lentas SELECT x FROM tabla … SELECT x FROM tabla INSERT INTO tabla … SELECT x FROM tabla … SELECT x FROM tabla … SELECT x FROM tabla … SELECT x FROM tabla … SELECT … 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 demás selects posteriores esperan a que el insert libere el bloqueo. Hasta que el primer select termina, no se terminan de ejecutar las demás consultas. ¡¡¡LLegamos a tener concurrencia 7!!!
  • 36. 2 - Arquitectura MySQL » MyISAM Bloqueos MyISAM (II) - Consultas lentas SELECT … SELECT … INSERT … SELECT … SELECT … SELECT … SELECT … SELECT … 0s 1s 2s 3s 4s 5s 6s 7s 8s 9s Si optimizamos el primer select, los bloqueos bajan exponencialmente. Concurrencia 4
  • 37. 2 - Arquitectura MySQL » MyISAM Bloqueos MyISAM (III) - Soluciones concurrent_inserts Las inserciones se realizan al final del archivo de datos. SELECT HIGH PRIORITY INSERT LOW PRIORITY INSERT DELAYED Se almacenan en un buffer, que va insertando cuando la tabla está libre.
  • 38. 2 - Arquitectura MySQL » MyISAM Key Cache (I) Caché para índices MyISAM key_buffer_size > 0 En MyISAM existe una caché de claves
  • 39. 2 - Arquitectura MySQL » MyISAM Key Cache (II) - Monitorización key_reads / key_read_requests < 1% key_blocks_not_flushed key_blocks_used key_blocks_unused key_read_requests key_reads key_writes_requests key_writes Hay que configurar la caché de claves para que quepan todas las claves en memoria.
  • 40. 2 - Arquitectura MySQL 2.2 - InnoDB
  • 41. 2 - Arquitectura MySQL » InnoDB InnoDB Características Transacciones InnoDB Buffers Índices Consejos
  • 42. 2 - Arquitectura MySQL » InnoDB Características de InnoDB (I): Almacenamiento /usr/local/mysql test table.frm ibdata1 ib_logfile0 ib_logfile1 InnoDB guarda toda la información de todas las tablas en el tablespace. Archivo ibdata
  • 43. 2 - Arquitectura MySQL » InnoDB Características de InnoDB (II): Files per table innodb_file_per_table /usr/local/mysql test table.frm table.ibd ibdata1 ib_logfile0 ib_logfile1 Si configuramos innodb_file_per_table tenemos un sub-espacio de tabla por cada tabla Archivo .ibd El espacio de tabla sigue conteniendo información de cada tabla, es necesario.
  • 44. 2 - Arquitectura MySQL » InnoDB Características de InnoDB (III) Transacciones full ACID Bloqueo a nivel de fila El bloqueo se realiza en la PK Buscando rangos, se bloquean también los huecos Bloqueo a nivel de tabla Cachea tanto índices como datos
  • 45. 2 - Arquitectura MySQL » InnoDB Transacciones (I) Atomic Consistent Isolated Durable START TRANSACTION COMMIT ROLLBACK AutoCommit = 1
  • 46. 2 - Arquitectura MySQL » InnoDB Transacciones (II) Isolation Levels: READ UNCOMMITED + CONCURRENCIA READ COMMITED - REPEATABLE READ - SERIALIZABLE AISLAMIENTO + SET TRANSACTION ISOLATION LEVEL READ UNCOMMITED Podemos configurar el Nivel de aislamiento para mejorar el rendimiento si no necesitamos tanta integridad en los datos.
  • 47. 2 - Arquitectura MySQL » InnoDB InnoDB Buffers (I) Buffer Pool MYSQL SERVER Caché de datos e índices Log Buffer Log de transacciones logfiles LOG BUFFER Log de transacciones BUFFER POOL Redo log ibdata commit checkpoints & checkpoints Diccionario de datos Undo log ib_logfiles ibdata
  • 48. 2 - Arquitectura MySQL » InnoDB InnoDB Buffers (II): Configuración 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
  • 49. 2 - Arquitectura MySQL » InnoDB Í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 también incluyen la clave primaria.
  • 50. 2 - Arquitectura MySQL » InnoDB Consejos (I) Usar claves primarias pequeñas (Enteros) Cargar datos ordenados por clave primaria Indexar prefijos (No hay compresión de índices)
  • 51. 2 - Arquitectura MySQL » InnoDB Consejos (II) innodb_additional_mem_pool_size innodb_autoextend_increment innodb_thread_concurrency SHOW ENGINE INNODB STATUS
  • 52. 1- Introducción. ¿Por qué optimizar? 2- Arquitectura de MySQL 3 - Optimización de consultas 4- Ruegos y Preguntas
  • 53. 3 - Optimización de consultas 3.1 - Query Cache
  • 54. 3 - Optimización de consultas » Query Cache Funcionamiento de la Query Cache (I) 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.
  • 55. 3 - Optimización de consultas » Query Cache Funcionamiento de la Query Cache (I) 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.
  • 56. 3 - Optimización de consultas » Query Cache Funcionamiento de la Query Cache (I) SELECT result MySQL server SELECT result 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.
  • 57. 3 - Optimización de consultas » Query Cache Funcionamiento de la Query Cache (II) SELECT result MySQL server SELECT result Query Cache Parse Optimization Execution MyISAM InnoDB Memory Tablas La próxima vez que se ejecute la misma consulta, se obtendrán los datos diréctamente de la cache. Lo que es un proceso casi instantáneo.
  • 58. 3 - Optimización de consultas » Query Cache Funcionamiento de la Query Cache (III) UPDATE MySQL server Query Cache Parse Optimization Execution MyISAM InnoDB Memory Tablas ¿Estos datos están siempre actualizados? Sí, porque si se modifican los datos subyacentes, la caché se limpia.
  • 59. 3 - Optimización de consultas » Query Cache Configurar la Query Cache 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
  • 60. 3 - Optimización de consultas » Query Cache Monitorizar la Query Cache (I) SET GLOBAL query_cache_size = 4 * 1024 * 1024; SHOW GLOBAL STATUS LIKE 'qcache%'; +-------------------------+---------+ | Variable_name | Value | +-------------------------+---------+ | Qcache_free_blocks | 1 | | Qcache_free_memory | 3555808 | | Qcache_hits | 460 | | Qcache_inserts | 173 | | Qcache_lowmem_prunes | 0 | | Qcache_not_cached | 37 | | Qcache_queries_in_cache | 173 | | Qcache_total_blocks | 366 | +-------------------------+---------+
  • 61. 3 - Optimización de consultas » Query Cache Monitorizar la Query Cache (II) SET GLOBAL query_cache_size = 4 * 1024 * 1024; SHOW GLOBAL STATUS LIKE 'qcache%'; +-------------------------+---------+ | Variable_name | Value | +-------------------------+---------+ | Qcache_free_blocks | 1 | | Qcache_free_memory | 3555808 | | Qcache_hits | 460 | | Qcache_inserts | 173 | | Qcache_lowmem_prunes | 0 | | Qcache_not_cached | 37 | | Qcache_queries_in_cache | 173 | | Qcache_total_blocks | 366 | +-------------------------+---------+
  • 62. 3 - Optimización de consultas » Query Cache Monitorizar la Query Cache (III) Uso = Qcache_hits / (Qcache_hits + COM_select) SHOW GLOBAL STATUS LIKE 'Qcache_hits'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Qcache_hits | 460 | +---------------+-------+ SHOW GLOBAL STATUS LIKE 'COM_select'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Com_select | 334 | +---------------+-------+
  • 63. 3 - Optimización de consultas 3.2 - mysqlslap
  • 64. 3 - Optimización de consultas » mysqlslap 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 mysqlslap permite realizar benchmarking básico de MySQL
  • 65. 3 - Optimización de consultas » mysqlslap 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
  • 66. 3 - Optimización de consultas » mysqlslap Preparar una suite de test 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
  • 67. 3 - Optimización de consultas » mysqlslap Preparar una suite de test: (I) Datos > CREATE TABLE CityHuge LIKE City; > INSERT INTO CityHuge SELECT NULL, Name, CountryCode, District, Population FROM City; > INSERT INTO CityHuge SELECT NULL, Name, CountryCode, District, Population FROM CityHuge; > SELECT COUNT(*) FROM CityHuge; +----------+ | COUNT(*) | +----------+ | 1044224 | +----------+ Podemos crear tablas grandes insertando los datos de esa misma tabla en sí misma.
  • 68. 3 - Optimización de consultas » mysqlslap Preparar una suite de test: (II) Consultas Logs general consultas lentas Podemos hacer suites de test a partir de consultas SQL
  • 69. 3 - Optimización de consultas » mysqlslap Preparar una suite de test: (II) Consultas Logs general consultas lentas SQL $ mysql world -N --batch -e "SELECT CONCAT( 'SELECT ID FROM CityHuge WHERE CountryCode="', code, '";') FROM Country" > test.sql Podemos hacer suites de test a partir de consultas SQL
  • 70. 3 - Optimización de consultas » mysqlslap Preparar una suite de test: (III) Servidor MySQL Exclusivo para el test Configuración similar a producción Limpiar cachés Desactivar la Query Cache
  • 71. 3 - Optimización de consultas » mysqlslap Preparar una suite de test: (IV) Resultados Una diferencia de un 10% no es representativa Test A : 5,45 s 6 Test B : 5,95 s 4,5 3 1,5 0 A B
  • 72. 3 - Optimización de consultas » mysqlslap Preparar una suite de test: (V) Resultados En producción se ejecutan consultas de varios tipos mezcladas: Test A (5 selects tabla 1) : 0,11 s Test B (5 selects tabla 2) : 45 s Test C (400 inserts en tablas 1 y 2) : 15 s Test D ( A + B + C intercalados) : 153s A B C A+B+C D 0 40 80 120 160 El test D tarda ¡¡3 veces más!! No hay que fijarse en el valor absoluto, en producción no tardará eso. Hay que fijarse en el porcentaje de mejora entre una opción y otra.
  • 73. 3 - Optimización de consultas 3.3 - EXPLAIN
  • 74. 3 - Optimización de consultas » EXPLAIN EXPLAIN EXPLAIN SELECT id FROM City WHERE Population > 1000000G *************************** 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 Explain informa de cómo va a ejecutar MySQL una consulta.
  • 75. 3 - Optimización de consultas » EXPLAIN ALTER TABLE City ADD INDEX (Population); ALTER TABLE City ADD INDEX `pop_code`(Population, CountryCode); EXPLAIN SELECT Name FROM City WHERE CountryCode = 'ESP' AND Population > 1000000G *************************** 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
  • 76. 3 - Optimización de consultas » EXPLAIN ALTER TABLE City ADD INDEX (Population); ALTER TABLE City ADD INDEX `pop_code`(Population, CountryCode); EXPLAIN SELECT Name FROM City WHERE CountryCode = 'ESP' AND Population > 1000000G *************************** 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
  • 77. 3 - Optimización de consultas » EXPLAIN ALTER TABLE City ADD INDEX (Population); ALTER TABLE City ADD INDEX `pop_code`(Population, CountryCode); EXPLAIN SELECT Name FROM City WHERE CountryCode = 'ESP' AND Population > 1000000G *************************** 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
  • 78. 3 - Optimización de consultas » EXPLAIN ALTER TABLE City ADD INDEX (Population); ALTER TABLE City ADD INDEX `pop_code`(Population, CountryCode); EXPLAIN SELECT Name FROM City WHERE CountryCode = 'ESP' AND Population > 1000000G *************************** 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
  • 79. 3 - Optimización de consultas » EXPLAIN > EXPLAIN > EXPLAIN SELECT * SELECT id FROM City FROM City WHERE ID = '345'G WHERE ID = '345'G ******** 1. row *********** ******** 1. row *********** id: 1 id: 1 select_type: SIMPLE select_type: SIMPLE table: City table: City type: const type: const possible_keys: PRIMARY possible_keys: PRIMARY key: PRIMARY key: PRIMARY key_len: 4 key_len: 4 ref: const ref: const rows: 1 rows: 1 Extra: Extra: Using index
  • 80. 3 - Optimización de consultas » EXPLAIN > EXPLAIN > EXPLAIN SELECT * SELECT id FROM City FROM City WHERE ID = '345'G WHERE ID = '345'G ******** 1. row *********** ******** 1. row *********** id: 1 id: 1 select_type: SIMPLE select_type: SIMPLE table: City table: City type: const type: const possible_keys: PRIMARY possible_keys: PRIMARY key: PRIMARY key: PRIMARY key_len: 4 key_len: 4 ref: const ref: const rows: 1 rows: 1 Extra: Extra: Using index Seleccionar sólo las columnas necesarias permite que: A veces los datos puedan leerse sólo de los índices (memoria). Se lean menos datos de disco en el resto de casos.
  • 81. 3 - Optimización de consultas » EXPLAIN > EXPLAIN > EXPLAIN SELECT COUNT(id) SELECT COUNT(*) FROM City FROM City WHERE CountryCode = 'ESP'G WHERE CountryCode = 'ESP'G 150,0 112,5 c i COUNT(id) COUNT(*) 75,0 1 5 29,974 3,837 2 5 31,862 6,009 37,5 4 5 63,253 10,087 8 5 125,721 19,412 0 1 2 4 8 COUNT(id) COUNT(*) En este caso, lo que ocurre es que COUNT(id) cuenta el número de filas cuyo id es != NULL. Para ello tiene que comprobar valor a valor.
  • 82. 3 - Optimización de consultas » EXPLAIN EXPLAIN SELECT City.Name, Country.Name FROM City, Country WHERE Country.Code = City.CountryCode AND Country.Name="Spain"G *********** 1. row ********** *********** 2. row ********** id: 1 id: 1 select_type: SIMPLE select_type: SIMPLE table: City table: Country type: ALL type: eq_ref possible_keys: NULL possible_keys: PRIMARY key: NULL key: PRIMARY key_len: NULL key_len: 3 ref: NULL ref: world.City.CountryCode rows: 4079 rows: 1 Extra: Extra: Using where La columna sobre la que se aplican las condiciones es importante.
  • 83. 3 - Optimización de consultas » EXPLAIN EXPLAIN SELECT City.Name, Country.Name FROM City, Country WHERE Country.Code = City.CountryCode AND Country.Name="Spain"G *********** 1. row ********** *********** 2. row ********** id: 1 id: 1 select_type: SIMPLE select_type: SIMPLE table: City table: Country type: ALL type: eq_ref possible_keys: NULL possible_keys: PRIMARY key: NULL key: PRIMARY key_len: NULL key_len: 3 ref: NULL ref: world.City.CountryCode rows: 4079 rows: 1 Extra: Extra: Using where La columna sobre la que se aplican las condiciones es importante.
  • 84. 3 - Optimización de consultas » EXPLAIN EXPLAIN SELECT City.Name, Country.Name FROM City, Country WHERE Country.Code = City.CountryCode AND Country.Code="ESP"G *********** 1. row ********** *********** 2. row ********** id: 1 id: 1 select_type: SIMPLE select_type: SIMPLE table: Country table: City type: const type: ALL possible_keys: PRIMARY possible_keys: NULL key: PRIMARY key: NULL key_len: 3 key_len: NULL ref: const ref: NULL rows: 1 rows: 4079 Extra: Extra: Using where La columna sobre la que se aplican las condiciones es importante.
  • 85. 3 - Optimización de consultas » EXPLAIN EXPLAIN SELECT City.Name, Country.Name FROM City, Country WHERE Country.Code = City.CountryCode AND Country.Code="ESP"G *********** 1. row ********** *********** 2. row ********** id: 1 id: 1 select_type: SIMPLE select_type: SIMPLE table: Country table: City type: const type: ALL possible_keys: PRIMARY possible_keys: NULL key: PRIMARY key: NULL key_len: 3 key_len: NULL ref: const ref: NULL rows: 1 rows: 4079 Extra: Extra: Using where La columna sobre la que se aplican las condiciones es importante.
  • 86. 3 - Optimización de consultas » EXPLAIN Forzar Índices USE INDEX (índices) IGNORE INDEX (índices) FORCE INDEX (índices)
  • 87. 3 - Optimización de consultas » EXPLAIN STRAIGHT_JOIN fuerza a que un JOIN se construya en el orden en el que se ha declarado
  • 88. 3 - Optimización de consultas » EXPLAIN ANALYZE TABLE Actualiza las estadísticas de una tabla Ejecutado periódicamente ayuda al optimizador
  • 89. 3 - Optimización de consultas 3.4 - Metodología para elegir el índice más óptimo
  • 90. 3 - Optimización de consultas » Metodología Metodología para elegir el índice más óptimo
  • 91. 3 - Optimización de consultas » Metodología Metodología para elegir el índice más óptimo Saber qué queremos hacer
  • 92. 3 - Optimización de consultas » Metodología Metodología para elegir el índice más óptimo Saber qué queremos hacer Saber cuál es la manera más óptima
  • 93. 3 - Optimización de consultas » Metodología Metodología para elegir el índice más óptimo Saber qué queremos hacer Saber cuál es la manera más óptima Saber qué hace mysql y por qué
  • 94. 3 - Optimización de consultas » Metodología Metodología para elegir el índice más óptimo Saber qué queremos hacer Saber cuál es la manera más óptima Saber qué hace mysql y por qué
  • 95. 3 - Optimización de consultas » Metodología Metodología para elegir el índice más óptimo Saber qué queremos hacer Saber cuál es la manera más óptima Saber qué hace mysql y por qué MySQL sólo utilizará un índice por tabla
  • 96. 3 - Optimización de consultas » Metodología Metodología para elegir el índice más óptimo Saber qué queremos hacer Saber cuál es la manera más óptima Saber qué hace mysql y por qué MySQL sólo utilizará un índice por tabla MySQL procesará un JOIN realizando el menor número de accesos
  • 97. 3 - Optimización de consultas » Metodología Metodología para elegir el índice más óptimo Saber qué queremos hacer Saber cuál es la manera más óptima Saber qué hace mysql y por qué MySQL sólo utilizará un índice por tabla MySQL procesará un JOIN realizando el menor número de accesos empezando por la tabla con un índice más optimo
  • 98. 3 - Optimización de consultas » Metodología Metodología para elegir el índice más óptimo Saber qué queremos hacer Saber cuál es la manera más óptima Saber qué hace mysql y por qué MySQL sólo utilizará un índice por tabla MySQL procesará un JOIN realizando el menor número de accesos empezando por la tabla con un índice más optimo dictado por las condiciones WHERE
  • 99. 3 - Optimización de consultas » Metodología Metodología para elegir el índice más óptimo Saber qué queremos hacer Saber cuál es la manera más óptima Saber qué hace mysql y por qué MySQL sólo utilizará un índice por tabla MySQL procesará un JOIN realizando el menor número de accesos empezando por la tabla con un índice más optimo dictado por las condiciones WHERE y utilizando claves para seleccionar los registros de otras tablas
  • 100. 3 - Optimización de consultas » Metodología Ejemplo EXPLAIN SELECT City.Name, Country.Name FROM City, Country WHERE Country.Code = City.CountryCode AND Country.Code = "ESP";
  • 101. 3 - Optimización de consultas » Metodología I Formatear EXPLAIN SELECT City.Name, Country.Name FROM City, Country WHERE Country.Code = City.CountryCode AND Country.Code = "ESP"; Existen Formateadores OnLine: http://www.dpriver.com/pp/sqlformat.htm
  • 102. 3 - Optimización de consultas » Metodología II Dibujar Tablas y Relaciones SELECT City.Name, Country.Name FROM City, Country WHERE Country.Code = City.CountryCode AND Country.Code = "ESP";
  • 103. 3 - Optimización de consultas » Metodología II Dibujar Tablas y Relaciones SELECT City.Name, Country.Name FROM City, City Country Country WHERE Country.Code = City.CountryCode AND Country.Code = "ESP";
  • 104. 3 - Optimización de consultas » Metodología II Dibujar Tablas y Relaciones SELECT City.Name, Country.Name FROM City, City Country Country WHERE Country.Code = City.CountryCode AND Country.Code = "ESP";
  • 105. 3 - Optimización de consultas » Metodología II Dibujar Tablas y Relaciones SELECT City.Name, Country.Name FROM City, City Country CountryCode Country WHERE Country.Code = City.CountryCode Code AND Country.Code = "ESP";
  • 106. 3 - Optimización de consultas » Metodología III Añadir columnas de SELECT y WHERE SELECT City.Name, Country.Name FROM City, City Country CountryCode Country WHERE Country.Code = City.CountryCode Code AND Country.Code = "ESP";
  • 107. 3 - Optimización de consultas » Metodología III Añadir columnas de SELECT y WHERE SELECT City.Name, Country.Name FROM City, City Country CountryCode Country Code = "ESP" WHERE Country.Code = City.CountryCode Code AND Country.Code = "ESP";
  • 108. 3 - Optimización de consultas » Metodología III Añadir columnas de SELECT y WHERE SELECT City.Name, Country.Name FROM City, City Country CountryCode Country Code = "ESP" WHERE Country.Code = City.CountryCode Code AND Country.Code = "ESP"; Name Name
  • 109. 3 - Optimización de consultas » Metodología IV Añadir Índices SELECT City.Name, Country.Name FROM City, City Country CountryCode Country PK Code = "ESP" WHERE Country.Code = City.CountryCode PK Code AND Country.Code = "ESP"; Name Name
  • 110. 3 - Optimización de consultas » Metodología V Elegir el mejor plan de actuación 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";
  • 111. 3 - Optimización de consultas » Metodología V Elegir el mejor plan de actuación Plan A City » Country Recorrer secuencialmente City Por cada registro en City (4000): Buscar una equivalencia en Country usando PK Seleccionar la fila sólo si Code = "ESP" De las filas seleccionadas, leer: City.Name (de la tabla) Country.Name (de la tabla) 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";
  • 112. 3 - Optimización de consultas » Metodología V Elegir el mejor plan de actuación Plan A Plan B City » Country Country » City Recorrer secuencialmente City Seleccionar Code = "ESP" de Country usando PK Por cada registro en City (4000): Por cada registro en Country (1): Buscar una equivalencia en Country Recorre secuencialmente City usando PK Seleccionar la fila sólo si CountryCode = Code Seleccionar la fila sólo si Code = "ESP" De las filas seleccionadas, leer: De las filas seleccionadas, leer: City.Name (de la tabla) City.Name (de la tabla) Country.Name (de la tabla) Country.Name (de la tabla) 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";
  • 113. 3 - Optimización de consultas » Metodología V Elegir el mejor plan de actuación Plan A Plan B City » Country Country » City Recorrer secuencialmente City Seleccionar Code = "ESP" de Country usando PK Por cada registro en City (4000): Por cada registro en Country (1): Buscar una equivalencia en Country Recorre secuencialmente City usando PK Seleccionar la fila sólo si CountryCode = Code Seleccionar la fila sólo si Code = "ESP" De las filas seleccionadas, leer: De las filas seleccionadas, leer: City.Name (de la tabla) City.Name (de la tabla) Country.Name (de la tabla) Country.Name (de la tabla) 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";
  • 114. 3 - Optimización de consultas » Metodología V Elegir el mejor plan de actuación Plan A Plan B City » Country Country » City Recorrer secuencialmente City Seleccionar Code = "ESP" de Country usando PK Por cada registro en City (4000): Por cada registro en Country (1): Buscar una equivalencia en Country Recorre secuencialmente City usando PK Seleccionar la fila sólo si CountryCode = Code Seleccionar la fila sólo si Code = "ESP" De las filas seleccionadas, leer: De las filas seleccionadas, leer: City.Name (de la tabla) City.Name (de la tabla) Country.Name (de la tabla) Country.Name (de la tabla) 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";
  • 115. 3 - Optimización de consultas » Metodología V Cotejar con EXPLAIN EXPLAIN SELECT City.Name, Country.Name FROM City, Country WHERE Country.Code = City.CountryCode AND Country.Code = "ESP"; *********** 1. row ********** table: Country type: const key: PRIMARY rows: 1 Extra: City Country *********** 2. row ********** CountryCode PK table: City Code = "ESP" PK type: ALL Code key: NULL Name Name rows: 4079 Extra: Using where
  • 116. 3 - Optimización de consultas » Metodología V Cotejar con EXPLAIN EXPLAIN Plan B SELECT City.Name, Country » City Country.Name Seleccionar Code = "ESP" de Country usando PK FROM City, Por cada registro en Country (1): Country Recorre secuencialmente City WHERE Country.Code = City.CountryCode Seleccionar la fila sólo si CountryCode = Code AND Country.Code = "ESP"; De las filas seleccionadas, leer: *********** 1. row ********** City.Name (de la tabla) table: Country Country.Name (de la tabla) type: const key: PRIMARY rows: 1 Extra: City Country *********** 2. row ********** CountryCode PK table: City Code = "ESP" PK type: ALL Code key: NULL Name Name rows: 4079 Extra: Using where
  • 117. 3 - Optimización de consultas » Metodología VI Optimizar y Adaptar ¿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
  • 118. 3 - Optimización de consultas » Metodología VII Optimizar el uso de índices SELECT City.Name, ¿Qué columnas añadir a un índice? Country.Name FROM City, Columnas JOIN Country WHERE Country.Code = City.CountryCode En la 2ª tabla deben ser la 1ª columna de una clave AND Country.Code = "ESP"; 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
  • 119. 3 - Optimización de consultas » Metodología VII Optimizar el uso de índices SELECT City.Name, ¿Qué columnas añadir a un índice? Country.Name FROM City, Columnas JOIN Country WHERE Country.Code = City.CountryCode En la 2ª tabla deben ser la 1ª columna de una clave AND Country.Code = "ESP"; 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
  • 120. 3 - Optimización de consultas » Metodología 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
  • 121. Ejercicio SELECT SUM(salary) FROM salaries WHERE from_date BETWEEN '1999-01-01' AND '2000-01-01';
  • 122. Ejercicio SELECT SUM(salary) FROM salaries WHERE from_date BETWEEN '1999-01-01' AND '2000-01-01'; ALTER TABLE salaries ADD INDEX date_salary(from_date, salary);
  • 123. Ejercicio 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;
  • 124. Ejercicio 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; ALTER TABLE titles ADD KEY curr_titles(to_date, emp_no, title);
  • 125. Ejercicio 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; ALTER TABLE titles ADD KEY to_date(to_date); PRIMARY (emp_no, title, from_date)
  • 126. Ejercicio 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();
  • 127. 3 - Optimización de consultas 3.5 - Optimización con Subconsultas
  • 128. 3 - Optimización de consultas » Optimización con subconsultas Consultas no correlativas EXPLAIN SELECT Name FROM City WHERE City.ID IN ( SELECT Capital FROM Country WHERE Country.Continent = 'Europe' )G ************* 1. row ************* ************** 2. row ************** id: 1 id: 2 select_type: PRIMARY select_type: DEPENDENT SUBQUERY table: City table: Country type: ALL type: ALL possible_keys: NULL possible_keys: NULL key: NULL key: NULL key_len: NULL key_len: NULL ref: NULL ref: NULL rows: 4079 rows: 239 Extra: Using where Extra: Using where Las subconsultas no correlativas son aquellas que se pueden ejecutar de manera independiente a la consulta principal.
  • 129. 3 - Optimización de consultas » Optimización con subconsultas Consultas no correlativas EXPLAIN SELECT Name FROM City, ( SELECT Capital FROM Country WHERE Country.Continent = 'Europe' ) co WHERE City.ID = co.CapitalG ******* 1. row ******* ******* 2. row ******* ******* 3. row ******* id: 1 id: 1 id: 2 select_type: PRIMARY select_type: PRIMARY select_type: DERIVED table: <derived2> table: City table: Country type: ALL type: eq_ref type: ALL possible_keys: NULL possible_keys: PRIMARY possible_keys: NULL key: NULL key: PRIMARY key: NULL key_len: NULL key_len: 4 key_len: NULL ref: NULL ref: co.Capital ref: NULL rows: 46 rows: 1 rows: 239 Extra: Extra: ... Las subconsultas no correlativas se pueden situar como una tabla con la que hacer JOIN
  • 130. 3 - Optimización de consultas » Optimización con subconsultas Consultas no correlativas EXPLAIN SELECT Name FROM City, Country WHERE City.ID = Country.Capital AND Country.Continent = 'Europe'G ************* 1. row ************* ************** 2. row ************** id: 1 id: 1 select_type: SIMPLE select_type: SIMPLE table: Country table: City type: ALL type: eq_ref possible_keys: NULL possible_keys: PRIMARY key: NULL key: PRIMARY key_len: NULL key_len: 4 ref: NULL ref: world.Country.Capital rows: 239 rows: 1 Extra: Using where Extra: A veces se pueden reescribir como un JOIN
  • 131. 3 - Optimización de consultas » Optimización con subconsultas Funciones de agregación SELECT Name, Population FROM Country, (SELECT MAX(Population) max_pop FROM Country) co WHERE Country.Population = co.max_pop; Y otras, como cuando se usan funciones de agregación, no.
  • 132. 3 - Optimización de consultas » Optimización con subconsultas 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%'); Las condiciones OR sobre campos de varias tablas no permite que se puedan usar índices.
  • 133. 3 - Optimización de consultas » Optimización con subconsultas 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 WHERE ci.Name LIKE 'Es%' ) ci_ids WHERE ci.ID = ci_ids.ID; Se puede reescribir como subconsultas para ayudar a MySQL.
  • 134. 3 - Optimización de consultas 3.6 - Optimización usando cachés propias
  • 135. 3 - Optimización de consultas » Optimización usando cachés propias Cachés propias City Country Name Continent 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.
  • 136. 3 - Optimización de consultas » Optimización usando cachés propias Cachés propias City Country City_Country City_Name Name Continent Continent Name Country_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.
  • 137. 3 - Optimización de consultas » Optimización usando cachés propias Cachés propias City Country City_Country City_Name Name Continent Continent Name Country_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.
  • 138. 3 - Optimización de consultas 3.7 - Optimización con MySQL 5.5
  • 139. 3 - Optimización de consultas » MySQL 5.5 MySQL 5.5 Source: http://datacharmer.blogspot.com/2009/04/mysql-54-performance-with-logging.html
  • 140. 3 - Optimización de consultas » MySQL 5.5 MySQL 5.5 x 1.59
  • 141. 3 - Optimización de consultas » MySQL 5.5 MySQL 5.5 Actualizar es un cambio "fácil" de llevar a cabo.
  • 142. 3 - Optimización de consultas 3.7 - Optimización con MySQL 5.5 3.7.1 - Particionado
  • 143. 3 - Optimización de consultas » Particionado Particionado http://www.slideshare.net/datacharmer/mysql-partitions
  • 144. 3 - Optimización de consultas 3.7 - Optimización con MySQL 5.5 3.7.2 - Triggers
  • 145. 3 - Optimización de consultas » Triggers Triggers Código que se ejecuta: ANTES DESPUÉS de INSERTAR MODIFICAR BORRAR
  • 146. 3 - Optimización de consultas » Triggers 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;
  • 147. 3 - Optimización de consultas » Triggers Triggers Auditoría Forzar Integridad Mantener cachés
  • 148. 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 Un trigger apenas afecta al rendimiento en comparación a un índice.
  • 149. 1- Introducción. ¿Por qué optimizar? 2- Arquitectura de MySQL 3- Optimización de consultas 4.- Ruegos y Preguntas
  • 151. Optimización del rendimiento con MySQL ( LSWC Noviembre 2011) Víctor Jiménez Cerrada <vjimenez@warp.es> @capitangolo http://slideshare.net/capitangolo