SlideShare una empresa de Scribd logo
1 de 34
Descargar para leer sin conexión
Rendimiento y optimización
de MySQL
                @davidbolufer
                chicisimo.com   1
presentación
• CTO en CHICISIMO
• Fundador ONESTIC
• NO SOY NINGÚN GURÚ!!!




                          2
Lecturas recomendadas
•   High Performance MySQL, 3º edición
•   MySQL 5.0 Certification Study Guide. AMAZON
•   http://www.mysqlperformanceblog.com/
•   http://www.xaprb.com/blog/ Baron Schwartz
•   http://miguelangelnieto.net/
•   http://hackmysql.com/




                                                  3
ABOUT CHICISIMO
• Chicisimo ‐> 10M páginas vistas al mes

• Reads / Writes: 98% / 2%

• Total         876.27M   661.8/s
  • QC Hits     557.59M   421.1/s   63.63%
  • DMS         235.06M   177.5/s    26.83%




                                              4
1. Arquitectura mysql
                  • 1º Nivel. Gestor de conexiones, 
                    autentificación y seguridad

                  • 2ª Nivel. Cache, parser de 
                    queries,  optimizador de 
                    consultas, funciones (stored
                    procedures, triggers, views,..)

                  • 3º Nivel. Storage Engines, 
                    MyISAM, InnoDB, Achive, 
                    custom, …
                                                       5
storage engines - Myisam
•   Default storage engine, el más veterano
•   Lock a nivel de tabla
•   Soporta índices FULL TEXT SEARCH
•   No índices entre tablas (JOINS)
•   No integridad referencial, no es transaccional 
•   Rápido DUMPS & IMPORTS
•   Recomendado si tienes una tasa muy alta de lecturas & inserts
•   Se corrompe con más facilidad, recovery más lento
•   MyISAM Merge: MySQL 5.1 se puede particionar tablas 
    grandes > rendimiento SELECT
                                                                    6
storage engines - innodb
•   Storage engine transaccional & entidad referencial
•   Lock a nivel de fila + MVCC (row snapshots)
•   Pueden producirse DEADLOCKS
•   COUNT(*) no es real debido a multiversiones
•   COMMIT es lento, OJO!
•   Muy lento DUMPS & IMPORTS
•   Más robusto que MyISAM & más rápido reparando
•   Recomendado si:
    • Necesitas transacciones
    • Alto nivel UPDATES & DELETES
                                                         7
storage engines - MEMORY
•   Todos los datos se guardan en memoria
•   Muy rápida para hacer queries
•   Podemos usar para mapear datos
•   Reinicio… adiós  a los datos pero se mantiene estructura
•   MySQL la usa internamente si una query necesita una tabla 
    temporal. Importante




                                                                 8
storage engines - ARCHIVE
• Sólo soporta INDEX & SELECT
• Cada fila está comprimida, menos I/O que MyISAM
• Perfecta para logging …

• Muchos más tipos: Falcon, CSV, NDB Cluster & Maria
  (remplazo futuro MyISAM)




                                                       9
2. Configuración Mysql
•   /etc/my.cnf
•   Una mala configuración puede tumbar el server
•   No hay que obsesionarse!
•   Percona al rescate! https://tools.percona.com/wizard
•   Ejemplos ‐> /usr/share/doc/mysql-server-5.X
•   Herramientas:
    • mysqlreport: Analiza y resume variables estado
    • mysqltuner: Asistente optimizar configuración
• Google!


                                                           10
Variables rendimiento…
• query_cache_size = 256M reserva la memoria
  • Query Cache… Por defecto está desactivada
• key_buffer = 256M no reserva la memoria
  • Key Buffer … tamaño asignado para índices MyISAM
• max_connections = 500 ojo, memory leak!
  • Procesos de MySQL ‐> Clientes conectados
• tmp_table_size = 128M
• max_heap_table_size = 128M
  • Memoria o disco? Disco = DEAD
• innodb_buffer_pool_size=2G
  • ¡IMPORTANTE! 50% de RAM mínimo recomendado!
                                                       11
Variables logging…
• log_error = /log/mysql/mysql-error.log
• log_queries_not_using_indexes = 1
• slow_query_log = 1
• slow_query_log_file = /log/mysql/mysql-
  slow.log
• Hasta MySQL 5.1.21, queries lentas > 1sg
• Parche PERCONA para bajar este tiempo




                                             12
3. Mysql & memory use
• Sumamos todos los buffers: 
  • key_buffer_size, innodb_buffer_pool_size, 
    innodb_additional_memory_pool_size, innodb_log_buffer_size, 
    query_cache_size


• Conexiones máximas  * 256Kb *
  •   read_buffer_size
  •   sort_buffer_size
  •   read_rnd_buffer_size
  •   tmp_table_size (128M)

• Si las consultas son complejas o poco óptimas podemos matar      13
  el server
4. Tipos de campos
• Menos es más. TRIVIAL

• Evitar valores NULL:
  • Definir como NOT NULL ‐> default value


• INTEGERS:
  • Espacio almacenamiento: 8,16,24,32 & 64 BITS
  • UNSIGNED
  • INT(11) = INT(1) 


                                                   14
4.1 campos de texto
• STRINGS:
  •   varchar(100): hasta 100 bytes + 1/2 byte
  •   Char(10): siempre 10 bytes
  •   BINARY & VARBINARY
  •   Char vs varchar?, cortas y fijas – char
• TEXT /BLOB
  • MySQL los trata como objetos independientes
  • ORDER BY text = tabla temporal en disco = MUERTE
  • Parche: ORDER BY SUBSTING(field, length)
• ENUM
  • Muestra STRING, almacena un INT
  • Mejor controlarlo desde nuestra aplicación         15
4.2 campos fecha
• DATETIME:
  • Almacena segundos
  • Desde año 1001 – 9999

• TIMESTAMP:
  • Almacena segundos
  • Desde 1970 – 2038

• DATETIME necesita el doble de espacio que TIMESTAMP


                                                        16
4.3 Identificadores
• Entero:
  • UNSIGNED – AUTO_INCREMENT
  • JOINS más rápidos
• ENUM
  • solo para tablas estáticas
  • JOINS no tan rápidos
• String
  •   Necesita mucho espacio, inserts & selects lentos 
  •   Ojo con los randoms
  •   UUID‐> usamos UHEX() /HEX() y guardamos BINARY(16)
  •   JOINS más lentos
                                                           17
índices
•   Estructura ordenada de datos
•   Importante que los índices puedan alojarse en memoria
•   Sirven agilizar búsquedas y ordenaciones
•   Índice funcionan de izquierda a derecha.
    • INDEX `user_data`
      (`apellido`,`nombre`,`fecha_nac`)
    • ¿Búsquedas de apellidos empiecen por B?: yes!
    • ¿Búsquedas de BOLUFER y nombre empiecen por D?: yes!
    • ¿Búsquedas de nombres empiecen por D?: NO!



                                                             18
índices: ¿tanto se nota?
• Tabla comentarios de chicisimo: 1M filas
• CREATE TABLE comments{
    `comment_ID` BIGINT(20) …,
        …
    `comment_type` VARCHAR(20) …,
    `comment_approved` VARCHAR(20) …,
    `comment_date` DATETIME …,
    `user_id` BIGINT(20) …,
   PRIMARY KEY (`comment_ID`)
  }



                                             19
índices: ¿tanto se nota?
• SELECT SQL_NO_CACHE * FROM `wp_1_comments`
  WHERE user_id = 3150
  • La consulta tardó sin índice 1,023 seg. No está mal …

 id    type    type   keys      key_len   ref     rows     Extra
 1    SIMPLE   ALL    NULL       NULL     NULL 1.012.563   Using
                                                           where

  • La consulta tardó con índice 0,026 seg ¡4000%!

 id    type    type    keys     key_len     ref    rows      Extra
  1   SIMPLE   REF    user_id      8      CONST    3004
                                                                     20
índices: ¿tanto se nota?
• SELECT SQL_NO_CACHE * FROM `wp_1_comments`
  WHERE user_id = 3150 ORDER BY `comment_date`
  DESC

  • La consulta tardó sin índice 1,0424 seg

  • La consulta tardó con índice anterior 0,0417 seg
     • EXPLAIN ‐> USING WHERE, USING FILESORT

  • Añadimos índice  en comment_date … 0,0403 seg
     • EXPLAIN ‐> USING WHERE, USING FILESORT

  • Añadimos índice user_id,comment_date … 0,0253 seg
     • EXPLAIN ‐> USING WHERE                           21
I’m bored…




             22
optimización: mi servidor muere…
1. Monitorización
2. Analizar SLOW QUERIES 
3. Buscar la(s) query(ies)  en nuestro código
4. Analizar query usando EXPLAIN
5. Optimizar la query: índices, denormalización, campos 
   calculados,…
6. Si:
     1.   Sigue fallando:‐> Volver al paso 1.
     2.   Llevo N  iteraciones ‐> Cambia de SERVER/TECNOLOGÍA
     3.   Funciona OK ‐> Congrats!

                                                                23
Opt. 1. monitorización
• Utilizamos:
  • Serverstats: Estado del servidor, memoria, load, cpu, MySQL, …
  • Pingdom : Avisos ante caídas por aplicación iPhone/Android
  • mytop:  top clone for MySQL




                                                                     24
Opt. 1. monitorización

• Estamos probando…
  • Icinga (fork de NAGIOS): Monitorización + alertas

  • PINBA: Monitorización tiempos de ejecución sobre PHP

  • pt‐collector/pt‐stack:  recolectar información en el momento 
    preciso Percona Toolkit




                                                                    25
Opt. 2. Slow queries
• slow_query_log_file se guardan las queries lentas.
• Necesitamos procesar el log y agrupar queries.
• mk‐query‐digest de Maatkit
• mk-query-digest mysqld-slow.log > slow-mayo.log
  • Qué queries han consumido más tiempo, no las que más veces se 
    han ejecutado
  • Analiza tiempo ejecución y tiempo de bloqueo


• Maatkit ya no se mantiene, Percona Toolkit


                                                                     26
Opt. 3. cazando queries
• Profiling:
  •   Clase que permite logar todas las queries
  •   Buscar donde se define una query, WP es un laberinto
  •   Calcula tiempos de ejecución (queries, cURL, PHP, …)
  •   Uso de REDIS (hited, missed, seted, …)


• A parte … usamos XHPROF para analizar la pila de llamadas, 
  uso de tiempo y memoria




                                                                27
Opt. 4. EXPLAIN …
• Muestra información sobre como procesa MySQL las queries




• Type (de mejor a peor):
  •   const: ID = 1, buscamos por PK o UNIQUE
  •   eq_ref: ID = 1 AND DNI = ‘111X’, buscamos por PK o UNIQUE
  •   ref: user_id=3150, devuelve todas las filas de un índice
  •   range: user_id > 10, devuelve  un rango de filas
  •   index: Escaneo completo del índice
  •   all: Escaneo completo de la tabla
                                                                  28
• Rows: Filas máximas a leer.
Opt. 5. queries - denormalizar
• Joins entre tablas con  order + where = tabla temporal

• SELECT SQL_NO_CACHE * FROM wp_1_comments INNER
  JOIN wp_1_posts ON wp_1_posts.ID =
  wp_1_comments.comment_post_ID
  WHERE wp_1_posts.post_author = 3150 AND
  wp_1_comments.user_id != 3150
  ORDER BY wp_1_comments.comment_date DESC

  •   Tiempo ejecución 1,815 seg
  •   Rows: 68.801
  •   wp_1_posts: using temporary, using filesort
  •   wp_1_comments: using where                           29
Opt. 5. queries - denormalizar
• Denormalizamos añadimos los campos a una de las tablas
• Mediante un TRIGGER mantenemos actualizados los campos 
  que hemos denormalizado
  • Tiempo ejecución 0,008 seg
  • wp_1_posts: using where
• ¿Este cambio en producción se nota?




                                                            30
Opt. 5. queries - denormalizar




                                 31
Opt. 5. queries - calculados
• Votos: 4,3 Millones
• Votos de usuarios registrados: 
  • Rankings mejores looks del día, mes y año. 
  • COUNT() con un RANGE = MUERTE
• ¿Cuantos votos recibe un usuario? COUNT()
• ¿Cuantos votos tiene un look? COUNT()

¿Solución?
• Proceso cada N que calcula los rankings y actualiza los valores
DATO
• Si usamos InnoDB, esto es casi una necesidad                      32
Opt. 5. queries – bricoConsejos
• Usar INSERT DELAYED siempre que sea posible: ejemplo 
  logs/activity

• Necesitamos buscar en un campo VARCHAR, ej: URL:
  • Crear un campo con un hash CRC32(‘http://chicisimo.com’)
  • Añadimos índice al campo y un TRIGGER para mantener el valor
  • WHERE url_crc=‘4240669402’ AND url = ‘http://chicisimo.com’


• No utilizar CURRENT_DATE o similares en WHERE, MySQL no 
  las cachea

                                                                   33
¡¡¡GRACIAS!!!




                34

Más contenido relacionado

La actualidad más candente

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
 
Así que pusiste MongoDB. Dime ¿cómo lo administras?
Así que pusiste MongoDB. Dime ¿cómo lo administras?Así que pusiste MongoDB. Dime ¿cómo lo administras?
Así que pusiste MongoDB. Dime ¿cómo lo administras?Alejandro E Brito Monedero
 
MySQL Una Introduccion Tecnica
MySQL Una Introduccion TecnicaMySQL Una Introduccion Tecnica
MySQL Una Introduccion TecnicaKeith Hollman
 
Introducción mongodb y desarrollo
Introducción mongodb y desarrolloIntroducción mongodb y desarrollo
Introducción mongodb y desarrolloJuan Ladetto
 
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 Cluster: El ‘qué’ y el ‘cómo’.
MySQL Cluster: El ‘qué’ y el ‘cómo’.MySQL Cluster: El ‘qué’ y el ‘cómo’.
MySQL Cluster: El ‘qué’ y el ‘cómo’.Keith Hollman
 
Consideraciones de hardware para SQL Server
Consideraciones de hardware para SQL ServerConsideraciones de hardware para SQL Server
Consideraciones de hardware para SQL ServerEduardo Castro
 
Dba PostgreSQL desde básico a avanzado parte1
Dba PostgreSQL desde básico a avanzado parte1Dba PostgreSQL desde básico a avanzado parte1
Dba PostgreSQL desde básico a avanzado parte1EQ SOFT EIRL
 
Formación en Almacenamiento, Open Storage Soluciones Low Cost.
Formación en Almacenamiento, Open Storage Soluciones Low Cost.Formación en Almacenamiento, Open Storage Soluciones Low Cost.
Formación en Almacenamiento, Open Storage Soluciones Low Cost.Strelia Technology Services
 
Mejores Prácticas Administración de Base de Datos Oracle
Mejores Prácticas Administración de Base de Datos OracleMejores Prácticas Administración de Base de Datos Oracle
Mejores Prácticas Administración de Base de Datos Oraclejftorres92
 
Manual my sql Utu atlantida 2015
Manual my sql Utu atlantida 2015Manual my sql Utu atlantida 2015
Manual my sql Utu atlantida 2015Bruno Regusci
 

La actualidad más candente (18)

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...
 
My sql clase_1
My sql clase_1My sql clase_1
My sql clase_1
 
Así que pusiste MongoDB. Dime ¿cómo lo administras?
Así que pusiste MongoDB. Dime ¿cómo lo administras?Así que pusiste MongoDB. Dime ¿cómo lo administras?
Así que pusiste MongoDB. Dime ¿cómo lo administras?
 
8. mysql
8. mysql8. mysql
8. mysql
 
MySQL Una Introduccion Tecnica
MySQL Una Introduccion TecnicaMySQL Una Introduccion Tecnica
MySQL Una Introduccion Tecnica
 
Requerimientos de PostgreSQL
Requerimientos de PostgreSQLRequerimientos de PostgreSQL
Requerimientos de PostgreSQL
 
Introducción mongodb y desarrollo
Introducción mongodb y desarrolloIntroducción mongodb y desarrollo
Introducción mongodb y desarrollo
 
My SQL
My SQLMy SQL
My SQL
 
My SQL
My SQLMy SQL
My SQL
 
Exposicion Mysql
Exposicion MysqlExposicion Mysql
Exposicion Mysql
 
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 Cluster: El ‘qué’ y el ‘cómo’.
MySQL Cluster: El ‘qué’ y el ‘cómo’.MySQL Cluster: El ‘qué’ y el ‘cómo’.
MySQL Cluster: El ‘qué’ y el ‘cómo’.
 
Consideraciones de hardware para SQL Server
Consideraciones de hardware para SQL ServerConsideraciones de hardware para SQL Server
Consideraciones de hardware para SQL Server
 
Dba PostgreSQL desde básico a avanzado parte1
Dba PostgreSQL desde básico a avanzado parte1Dba PostgreSQL desde básico a avanzado parte1
Dba PostgreSQL desde básico a avanzado parte1
 
Formación en Almacenamiento, Open Storage Soluciones Low Cost.
Formación en Almacenamiento, Open Storage Soluciones Low Cost.Formación en Almacenamiento, Open Storage Soluciones Low Cost.
Formación en Almacenamiento, Open Storage Soluciones Low Cost.
 
Mejores Prácticas Administración de Base de Datos Oracle
Mejores Prácticas Administración de Base de Datos OracleMejores Prácticas Administración de Base de Datos Oracle
Mejores Prácticas Administración de Base de Datos Oracle
 
Manual my sql Utu atlantida 2015
Manual my sql Utu atlantida 2015Manual my sql Utu atlantida 2015
Manual my sql Utu atlantida 2015
 
MYSQL
MYSQL MYSQL
MYSQL
 

Destacado

Mysql Seguridad Replicacion
Mysql Seguridad ReplicacionMysql Seguridad Replicacion
Mysql Seguridad Replicacionchristian nieto
 
Guia paso a paso virtual box
Guia paso a paso virtual boxGuia paso a paso virtual box
Guia paso a paso virtual boxCarlos Vera Baene
 
Consultas avanzadas
Consultas avanzadasConsultas avanzadas
Consultas avanzadasAlondra Katt
 
Ventajas y desventajas mysql
Ventajas y desventajas mysqlVentajas y desventajas mysql
Ventajas y desventajas mysqlMary Ruiz
 
Combinacion de consultas y consultas multitablas
Combinacion de consultas y consultas multitablasCombinacion de consultas y consultas multitablas
Combinacion de consultas y consultas multitablasclaudia contreras
 
Sql Consultas MáS Complejas
Sql Consultas MáS ComplejasSql Consultas MáS Complejas
Sql Consultas MáS Complejasalexmerono
 
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)Aurimas Mikalauskas
 
10 sistemas gestores de base de datos
10 sistemas gestores de base de datos10 sistemas gestores de base de datos
10 sistemas gestores de base de datosGusttavo Nipas
 

Destacado (11)

Mysql Seguridad Replicacion
Mysql Seguridad ReplicacionMysql Seguridad Replicacion
Mysql Seguridad Replicacion
 
Ejercicios java
Ejercicios javaEjercicios java
Ejercicios java
 
Guia paso a paso virtual box
Guia paso a paso virtual boxGuia paso a paso virtual box
Guia paso a paso virtual box
 
Consultas avanzadas
Consultas avanzadasConsultas avanzadas
Consultas avanzadas
 
Ventajas y desventajas mysql
Ventajas y desventajas mysqlVentajas y desventajas mysql
Ventajas y desventajas mysql
 
Combinacion de consultas y consultas multitablas
Combinacion de consultas y consultas multitablasCombinacion de consultas y consultas multitablas
Combinacion de consultas y consultas multitablas
 
8.ejercicios SQL access
8.ejercicios SQL access8.ejercicios SQL access
8.ejercicios SQL access
 
Sql Consultas MáS Complejas
Sql Consultas MáS ComplejasSql Consultas MáS Complejas
Sql Consultas MáS Complejas
 
MYSQL
MYSQLMYSQL
MYSQL
 
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
 
10 sistemas gestores de base de datos
10 sistemas gestores de base de datos10 sistemas gestores de base de datos
10 sistemas gestores de base de datos
 

Similar a Rendimiento y optimización de MySQL

SQL Server 2016 Tablas en Memoria
SQL Server 2016 Tablas en MemoriaSQL Server 2016 Tablas en Memoria
SQL Server 2016 Tablas en MemoriaEduardo Castro
 
In-Memory OLTP en SQL Server 2016
In-Memory OLTP en SQL Server 2016In-Memory OLTP en SQL Server 2016
In-Memory OLTP en SQL Server 2016Joseph Lopez
 
SQL Server Fundamentals 3ra Sesion
SQL Server Fundamentals 3ra SesionSQL Server Fundamentals 3ra Sesion
SQL Server Fundamentals 3ra SesionJulián Castiblanco
 
Carbura tusql sesion1_slideshare
Carbura tusql sesion1_slideshareCarbura tusql sesion1_slideshare
Carbura tusql sesion1_slideshareJulián Castiblanco
 
Taller Redis
Taller RedisTaller Redis
Taller Redisbetabeers
 
Aplicaciones web altamente escalables con Redis
Aplicaciones web altamente escalables con RedisAplicaciones web altamente escalables con Redis
Aplicaciones web altamente escalables con RedisAlberto Gimeno
 
Conociendo los cambios de SQL Server a partir de 2012 a 2016
Conociendo los cambios de SQL Server a partir de 2012 a 2016Conociendo los cambios de SQL Server a partir de 2012 a 2016
Conociendo los cambios de SQL Server a partir de 2012 a 2016Joseph Lopez
 
Buenas prácticas que debes seguir en la administración de tu SQL Server
Buenas prácticas que debes seguir en la administración de tu SQL ServerBuenas prácticas que debes seguir en la administración de tu SQL Server
Buenas prácticas que debes seguir en la administración de tu SQL ServerSolidQ
 
Mejores prácticas desarrollo de base de datos
Mejores prácticas desarrollo de base de datos Mejores prácticas desarrollo de base de datos
Mejores prácticas desarrollo de base de datos Eduardo Castro
 
In memory
In memoryIn memory
In memorySolidQ
 
Redis, base de datos NoSQL clave-valor
Redis, base de datos NoSQL clave-valorRedis, base de datos NoSQL clave-valor
Redis, base de datos NoSQL clave-valorAlberto Gimeno
 
10 Tips ‘n’ Tricks for DBAs
10 Tips ‘n’ Tricks for DBAs10 Tips ‘n’ Tricks for DBAs
10 Tips ‘n’ Tricks for DBAsdbLearner
 
Novedades deSQL Server 2014 en Motor Relacional | SolidQ Summit 2014
Novedades deSQL Server 2014 en Motor Relacional | SolidQ Summit 2014Novedades deSQL Server 2014 en Motor Relacional | SolidQ Summit 2014
Novedades deSQL Server 2014 en Motor Relacional | SolidQ Summit 2014SolidQ
 
Novedades de SQL Server 2014 en motor relacional
Novedades de SQL Server 2014 en motor relacionalNovedades de SQL Server 2014 en motor relacional
Novedades de SQL Server 2014 en motor relacionalEnrique Catala Bañuls
 
Database fundamental itprosdc_chapter2
Database fundamental itprosdc_chapter2Database fundamental itprosdc_chapter2
Database fundamental itprosdc_chapter2Julián Castiblanco
 

Similar a Rendimiento y optimización de MySQL (20)

SQL Server 2016 Tablas en Memoria
SQL Server 2016 Tablas en MemoriaSQL Server 2016 Tablas en Memoria
SQL Server 2016 Tablas en Memoria
 
In-Memory OLTP en SQL Server 2016
In-Memory OLTP en SQL Server 2016In-Memory OLTP en SQL Server 2016
In-Memory OLTP en SQL Server 2016
 
MySQL Good Database Design
MySQL Good Database DesignMySQL Good Database Design
MySQL Good Database Design
 
SQL Server Fundamentals 3ra Sesion
SQL Server Fundamentals 3ra SesionSQL Server Fundamentals 3ra Sesion
SQL Server Fundamentals 3ra Sesion
 
Carbura tusql sesion1_slideshare
Carbura tusql sesion1_slideshareCarbura tusql sesion1_slideshare
Carbura tusql sesion1_slideshare
 
In-Memory OLTP en SQL Server 2014
In-Memory OLTP en SQL Server 2014In-Memory OLTP en SQL Server 2014
In-Memory OLTP en SQL Server 2014
 
Taller Redis
Taller RedisTaller Redis
Taller Redis
 
Presentacion BD NoSQL
Presentacion  BD NoSQLPresentacion  BD NoSQL
Presentacion BD NoSQL
 
Aplicaciones web altamente escalables con Redis
Aplicaciones web altamente escalables con RedisAplicaciones web altamente escalables con Redis
Aplicaciones web altamente escalables con Redis
 
Conociendo los cambios de SQL Server a partir de 2012 a 2016
Conociendo los cambios de SQL Server a partir de 2012 a 2016Conociendo los cambios de SQL Server a partir de 2012 a 2016
Conociendo los cambios de SQL Server a partir de 2012 a 2016
 
Buenas prácticas que debes seguir en la administración de tu SQL Server
Buenas prácticas que debes seguir en la administración de tu SQL ServerBuenas prácticas que debes seguir en la administración de tu SQL Server
Buenas prácticas que debes seguir en la administración de tu SQL Server
 
Mejores prácticas desarrollo de base de datos
Mejores prácticas desarrollo de base de datos Mejores prácticas desarrollo de base de datos
Mejores prácticas desarrollo de base de datos
 
In memory
In memoryIn memory
In memory
 
Redis, base de datos NoSQL clave-valor
Redis, base de datos NoSQL clave-valorRedis, base de datos NoSQL clave-valor
Redis, base de datos NoSQL clave-valor
 
Codemotion cacheandolanube
Codemotion cacheandolanubeCodemotion cacheandolanube
Codemotion cacheandolanube
 
10 Tips ‘n’ Tricks for DBAs
10 Tips ‘n’ Tricks for DBAs10 Tips ‘n’ Tricks for DBAs
10 Tips ‘n’ Tricks for DBAs
 
Las cronicas de redis
Las cronicas de redisLas cronicas de redis
Las cronicas de redis
 
Novedades deSQL Server 2014 en Motor Relacional | SolidQ Summit 2014
Novedades deSQL Server 2014 en Motor Relacional | SolidQ Summit 2014Novedades deSQL Server 2014 en Motor Relacional | SolidQ Summit 2014
Novedades deSQL Server 2014 en Motor Relacional | SolidQ Summit 2014
 
Novedades de SQL Server 2014 en motor relacional
Novedades de SQL Server 2014 en motor relacionalNovedades de SQL Server 2014 en motor relacional
Novedades de SQL Server 2014 en motor relacional
 
Database fundamental itprosdc_chapter2
Database fundamental itprosdc_chapter2Database fundamental itprosdc_chapter2
Database fundamental itprosdc_chapter2
 

Último

EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 

Último (10)

EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 

Rendimiento y optimización de MySQL

  • 1. Rendimiento y optimización de MySQL @davidbolufer chicisimo.com 1
  • 3. Lecturas recomendadas • High Performance MySQL, 3º edición • MySQL 5.0 Certification Study Guide. AMAZON • http://www.mysqlperformanceblog.com/ • http://www.xaprb.com/blog/ Baron Schwartz • http://miguelangelnieto.net/ • http://hackmysql.com/ 3
  • 4. ABOUT CHICISIMO • Chicisimo ‐> 10M páginas vistas al mes • Reads / Writes: 98% / 2% • Total         876.27M   661.8/s • QC Hits     557.59M   421.1/s   63.63% • DMS         235.06M   177.5/s    26.83% 4
  • 5. 1. Arquitectura mysql • 1º Nivel. Gestor de conexiones,  autentificación y seguridad • 2ª Nivel. Cache, parser de  queries,  optimizador de  consultas, funciones (stored procedures, triggers, views,..) • 3º Nivel. Storage Engines,  MyISAM, InnoDB, Achive,  custom, … 5
  • 6. storage engines - Myisam • Default storage engine, el más veterano • Lock a nivel de tabla • Soporta índices FULL TEXT SEARCH • No índices entre tablas (JOINS) • No integridad referencial, no es transaccional  • Rápido DUMPS & IMPORTS • Recomendado si tienes una tasa muy alta de lecturas & inserts • Se corrompe con más facilidad, recovery más lento • MyISAM Merge: MySQL 5.1 se puede particionar tablas  grandes > rendimiento SELECT 6
  • 7. storage engines - innodb • Storage engine transaccional & entidad referencial • Lock a nivel de fila + MVCC (row snapshots) • Pueden producirse DEADLOCKS • COUNT(*) no es real debido a multiversiones • COMMIT es lento, OJO! • Muy lento DUMPS & IMPORTS • Más robusto que MyISAM & más rápido reparando • Recomendado si: • Necesitas transacciones • Alto nivel UPDATES & DELETES 7
  • 8. storage engines - MEMORY • Todos los datos se guardan en memoria • Muy rápida para hacer queries • Podemos usar para mapear datos • Reinicio… adiós  a los datos pero se mantiene estructura • MySQL la usa internamente si una query necesita una tabla  temporal. Importante 8
  • 9. storage engines - ARCHIVE • Sólo soporta INDEX & SELECT • Cada fila está comprimida, menos I/O que MyISAM • Perfecta para logging … • Muchos más tipos: Falcon, CSV, NDB Cluster & Maria (remplazo futuro MyISAM) 9
  • 10. 2. Configuración Mysql • /etc/my.cnf • Una mala configuración puede tumbar el server • No hay que obsesionarse! • Percona al rescate! https://tools.percona.com/wizard • Ejemplos ‐> /usr/share/doc/mysql-server-5.X • Herramientas: • mysqlreport: Analiza y resume variables estado • mysqltuner: Asistente optimizar configuración • Google! 10
  • 11. Variables rendimiento… • query_cache_size = 256M reserva la memoria • Query Cache… Por defecto está desactivada • key_buffer = 256M no reserva la memoria • Key Buffer … tamaño asignado para índices MyISAM • max_connections = 500 ojo, memory leak! • Procesos de MySQL ‐> Clientes conectados • tmp_table_size = 128M • max_heap_table_size = 128M • Memoria o disco? Disco = DEAD • innodb_buffer_pool_size=2G • ¡IMPORTANTE! 50% de RAM mínimo recomendado! 11
  • 12. Variables logging… • log_error = /log/mysql/mysql-error.log • log_queries_not_using_indexes = 1 • slow_query_log = 1 • slow_query_log_file = /log/mysql/mysql- slow.log • Hasta MySQL 5.1.21, queries lentas > 1sg • Parche PERCONA para bajar este tiempo 12
  • 13. 3. Mysql & memory use • Sumamos todos los buffers:  • key_buffer_size, innodb_buffer_pool_size,  innodb_additional_memory_pool_size, innodb_log_buffer_size,  query_cache_size • Conexiones máximas  * 256Kb * • read_buffer_size • sort_buffer_size • read_rnd_buffer_size • tmp_table_size (128M) • Si las consultas son complejas o poco óptimas podemos matar  13 el server
  • 14. 4. Tipos de campos • Menos es más. TRIVIAL • Evitar valores NULL: • Definir como NOT NULL ‐> default value • INTEGERS: • Espacio almacenamiento: 8,16,24,32 & 64 BITS • UNSIGNED • INT(11) = INT(1)  14
  • 15. 4.1 campos de texto • STRINGS: • varchar(100): hasta 100 bytes + 1/2 byte • Char(10): siempre 10 bytes • BINARY & VARBINARY • Char vs varchar?, cortas y fijas – char • TEXT /BLOB • MySQL los trata como objetos independientes • ORDER BY text = tabla temporal en disco = MUERTE • Parche: ORDER BY SUBSTING(field, length) • ENUM • Muestra STRING, almacena un INT • Mejor controlarlo desde nuestra aplicación 15
  • 16. 4.2 campos fecha • DATETIME: • Almacena segundos • Desde año 1001 – 9999 • TIMESTAMP: • Almacena segundos • Desde 1970 – 2038 • DATETIME necesita el doble de espacio que TIMESTAMP 16
  • 17. 4.3 Identificadores • Entero: • UNSIGNED – AUTO_INCREMENT • JOINS más rápidos • ENUM • solo para tablas estáticas • JOINS no tan rápidos • String • Necesita mucho espacio, inserts & selects lentos  • Ojo con los randoms • UUID‐> usamos UHEX() /HEX() y guardamos BINARY(16) • JOINS más lentos 17
  • 18. índices • Estructura ordenada de datos • Importante que los índices puedan alojarse en memoria • Sirven agilizar búsquedas y ordenaciones • Índice funcionan de izquierda a derecha. • INDEX `user_data` (`apellido`,`nombre`,`fecha_nac`) • ¿Búsquedas de apellidos empiecen por B?: yes! • ¿Búsquedas de BOLUFER y nombre empiecen por D?: yes! • ¿Búsquedas de nombres empiecen por D?: NO! 18
  • 19. índices: ¿tanto se nota? • Tabla comentarios de chicisimo: 1M filas • CREATE TABLE comments{ `comment_ID` BIGINT(20) …, … `comment_type` VARCHAR(20) …, `comment_approved` VARCHAR(20) …, `comment_date` DATETIME …, `user_id` BIGINT(20) …, PRIMARY KEY (`comment_ID`) } 19
  • 20. índices: ¿tanto se nota? • SELECT SQL_NO_CACHE * FROM `wp_1_comments` WHERE user_id = 3150 • La consulta tardó sin índice 1,023 seg. No está mal … id type type keys key_len ref rows Extra 1 SIMPLE ALL NULL NULL NULL 1.012.563 Using where • La consulta tardó con índice 0,026 seg ¡4000%! id type type keys key_len ref rows Extra 1 SIMPLE REF user_id 8 CONST 3004 20
  • 21. índices: ¿tanto se nota? • SELECT SQL_NO_CACHE * FROM `wp_1_comments` WHERE user_id = 3150 ORDER BY `comment_date` DESC • La consulta tardó sin índice 1,0424 seg • La consulta tardó con índice anterior 0,0417 seg • EXPLAIN ‐> USING WHERE, USING FILESORT • Añadimos índice  en comment_date … 0,0403 seg • EXPLAIN ‐> USING WHERE, USING FILESORT • Añadimos índice user_id,comment_date … 0,0253 seg • EXPLAIN ‐> USING WHERE 21
  • 23. optimización: mi servidor muere… 1. Monitorización 2. Analizar SLOW QUERIES  3. Buscar la(s) query(ies)  en nuestro código 4. Analizar query usando EXPLAIN 5. Optimizar la query: índices, denormalización, campos  calculados,… 6. Si: 1. Sigue fallando:‐> Volver al paso 1. 2. Llevo N  iteraciones ‐> Cambia de SERVER/TECNOLOGÍA 3. Funciona OK ‐> Congrats! 23
  • 24. Opt. 1. monitorización • Utilizamos: • Serverstats: Estado del servidor, memoria, load, cpu, MySQL, … • Pingdom : Avisos ante caídas por aplicación iPhone/Android • mytop:  top clone for MySQL 24
  • 25. Opt. 1. monitorización • Estamos probando… • Icinga (fork de NAGIOS): Monitorización + alertas • PINBA: Monitorización tiempos de ejecución sobre PHP • pt‐collector/pt‐stack:  recolectar información en el momento  preciso Percona Toolkit 25
  • 26. Opt. 2. Slow queries • slow_query_log_file se guardan las queries lentas. • Necesitamos procesar el log y agrupar queries. • mk‐query‐digest de Maatkit • mk-query-digest mysqld-slow.log > slow-mayo.log • Qué queries han consumido más tiempo, no las que más veces se  han ejecutado • Analiza tiempo ejecución y tiempo de bloqueo • Maatkit ya no se mantiene, Percona Toolkit 26
  • 27. Opt. 3. cazando queries • Profiling: • Clase que permite logar todas las queries • Buscar donde se define una query, WP es un laberinto • Calcula tiempos de ejecución (queries, cURL, PHP, …) • Uso de REDIS (hited, missed, seted, …) • A parte … usamos XHPROF para analizar la pila de llamadas,  uso de tiempo y memoria 27
  • 28. Opt. 4. EXPLAIN … • Muestra información sobre como procesa MySQL las queries • Type (de mejor a peor): • const: ID = 1, buscamos por PK o UNIQUE • eq_ref: ID = 1 AND DNI = ‘111X’, buscamos por PK o UNIQUE • ref: user_id=3150, devuelve todas las filas de un índice • range: user_id > 10, devuelve  un rango de filas • index: Escaneo completo del índice • all: Escaneo completo de la tabla 28 • Rows: Filas máximas a leer.
  • 29. Opt. 5. queries - denormalizar • Joins entre tablas con  order + where = tabla temporal • SELECT SQL_NO_CACHE * FROM wp_1_comments INNER JOIN wp_1_posts ON wp_1_posts.ID = wp_1_comments.comment_post_ID WHERE wp_1_posts.post_author = 3150 AND wp_1_comments.user_id != 3150 ORDER BY wp_1_comments.comment_date DESC • Tiempo ejecución 1,815 seg • Rows: 68.801 • wp_1_posts: using temporary, using filesort • wp_1_comments: using where 29
  • 30. Opt. 5. queries - denormalizar • Denormalizamos añadimos los campos a una de las tablas • Mediante un TRIGGER mantenemos actualizados los campos  que hemos denormalizado • Tiempo ejecución 0,008 seg • wp_1_posts: using where • ¿Este cambio en producción se nota? 30
  • 31. Opt. 5. queries - denormalizar 31
  • 32. Opt. 5. queries - calculados • Votos: 4,3 Millones • Votos de usuarios registrados:  • Rankings mejores looks del día, mes y año.  • COUNT() con un RANGE = MUERTE • ¿Cuantos votos recibe un usuario? COUNT() • ¿Cuantos votos tiene un look? COUNT() ¿Solución? • Proceso cada N que calcula los rankings y actualiza los valores DATO • Si usamos InnoDB, esto es casi una necesidad 32
  • 33. Opt. 5. queries – bricoConsejos • Usar INSERT DELAYED siempre que sea posible: ejemplo  logs/activity • Necesitamos buscar en un campo VARCHAR, ej: URL: • Crear un campo con un hash CRC32(‘http://chicisimo.com’) • Añadimos índice al campo y un TRIGGER para mantener el valor • WHERE url_crc=‘4240669402’ AND url = ‘http://chicisimo.com’ • No utilizar CURRENT_DATE o similares en WHERE, MySQL no  las cachea 33