Optimización de bases de datos MySQL
¿Problemas con el rendimiento de tu MySQL?
Si tu base de datos de MySQL no rinde como debiera, contáctanos y realizaremos una optimización MySQL en tu servidor o plataforma para mejorar dicho rendimiento:
- Tuning de la configuración del servidor: modifcamos la configuración de INNODB, buffers, tamaños de cachés, etc. para sacar el máximo posible al servidor
- Análisis del modelo de datos y mejora del mismo incluyendo particionamiento vertical y horizontal en casos necesarios
- Correción de índices y claves a partir de patrones de ejecución de consultas
- Análisis y optimización de SQL en queries lentas
- Documentación con explicaciones de las acciones realizadas, reportes sobre ejecución de queries y guía de buenas prácticas futuras
¿Quieres ver como optimizamos consultas?
Aquí tienes algunos ejemplos reales encontrados en optimizaciones realizadas a clientes o pruebas de concepto realizadas:
Query 1
Original - Tiempo medio de ejecución: 0,99 segundos
Optimizada - Tiempo medio de ejecución: 0,07 segundos
SELECT id_usuario, login, nombre, apellido, sexo, img_fichero, img_updatefecha, id_pais, id_lugar, tot_contactos FROM USUARIOS WHERE baja=0 AND (id_usuario IN (SELECT id_agregado FROM CONTACTOS WHERE id_agregante=1518 AND activo=1) OR id_usuario IN (SELECT id_agregante FROM CONTACTOS WHERE id_agregado=1518 AND activo=1 )) ORDER BY fecha_ultimo_post DESC
(SELECT USUARIOS.id_usuario, login, nombre, apellido, sexo, img_fichero, img_updatefecha, id_pais, id_lugar, tot_contactos, USUARIOS.fecha_ultimo_post FROM USUARIOS JOIN CONTACTOS ON USUARIOS.id_usuario=CONTACTOS.id_agregado WHERE USUARIOS.baja=0 AND CONTACTOS.id_agregante=1518 AND CONTACTOS.activo=1 ) UNION DISTINCT ( SELECT USUARIOS.id_usuario, login, nombre, apellido, sexo, img_fichero, img_updatefecha, id_pais, id_lugar, tot_contactos, USUARIOS.fecha_ultimo_post FROM USUARIOS JOIN CONTACTOS ON USUARIOS.id_usuario=CONTACTOS.id_agregante WHERE USUARIOS.baja=0 AND CONTACTOS.id_agregado=1518 AND CONTACTOS.activo=1 ) ORDER BY fecha_ultimo_post desc;
Query 2
Original - Tiempo medio de ejecución: 1,03 segundos
Optimizada - Tiempo medio de ejecución: 0,03 segundos
SELECT p.* FROM payment p WHERE p.payment_date = (SELECT MAX(payment_date) FROM payment WHERE customer_id=p.customer_id )
SELECT p.* FROM ( SELECT customer_id, MAX(payment_date) as last_order FROM payment GROUP BY customer_id ) AS last_orders INNER JOIN payment p ON p.customer_id = last_orders.customer_id AND p.payment_date = last_orders.last_order
Query 3
Original - Consulta no cacheable
Optimizada - Consulta cacheable
SELECT * FROM Orders WHERE TO_DAYS(CURRENT_DATE()) – TO_DAYS(order_created) <= 7
SELECT order_id, customer_id, order_total, order_created FROM Orders WHERE order_created >= '2013-02-01' - INTERVAL 7 DAY
Query 4
Original - Tiempo medio de ejecución: 2,21 segundos
Optimizada - Tiempo medio de ejecución: 0,20 segundos
SELECT id_post, id_usuario, id_tipo_envio_post, texto, tipo, num_comentarios, fecha_publicacion, priv, vidupl_file, vidupl_img, vidmov_file, vidmov_img, vidcam_file, vidcam_img, vid_id_youtube, vid_tit_youtube, vid_thumb_youtube, vid_time_youtube, mus_id_youtube, mus_tit_youtube, mus_time_youtube, img_fichero, link_tit, link_url, link_texto, link_img, evento_tit, evento_categoria, evento_tipo, evento_fecha_inicio, evento_fecha_fin, evento_telefono_contacto, evento_email, evento_pagina_web, evento_img_site, evento_img_site_size, map_direccion, evento_cancelado,map_latitud, map_longitud, map_zoom, map_id_pais FROM POSTS WHERE (id_usuario=31436 OR id_usuario in (SELECT id_agregado FROM CONTACTOS WHERE id_agregante=31436 and activo=1) OR id_usuario in (SELECT id_agregante FROM CONTACTOS WHERE id_agregado=31436 and activo=1) ) AND (priv=0 or priv=1) AND eliminado=0 AND eliminado_baja=0 AND es_spam=0 ORDER BY id_post DESC
(SELECT p.id_post, p.id_usuario, p.id_tipo_envio_post, p.texto, p.tipo, p.num_comentarios, p.fecha_publicacion, p.priv, p.vidupl_file, p.vidupl_img, p.vidmov_file, p.vidmov_img, p.vidcam_file, p.vidcam_img, p.vid_id_youtube, p.vid_tit_youtube, p.vid_thumb_youtube, p.vid_time_youtube, p.mus_id_youtube, p.mus_tit_youtube, p.mus_time_youtube, p.img_fichero, p.link_tit, p.link_url, p.link_texto, p.link_img, p.evento_tit, p.evento_categoria, p.evento_tipo, p.evento_fecha_inicio, p.evento_fecha_fin, p.evento_telefono_contacto, p.evento_email, p.evento_pagina_web, p.evento_img_site, p.evento_img_site_size, p.map_direccion, p.evento_cancelado, p.map_latitud, p.map_longitud, p.map_zoom, p.map_id_pais FROM POSTS p JOIN CONTACTOS c ON p.id_usuario=c.id_agregado WHERE (p.priv=0 OR p.priv=1) AND p.eliminado=0 AND p.eliminado_baja=0 AND p.es_spam=0 AND c.id_agregante=31436 AND c.activo=1 ) UNION DISTINCT (SELECT p.id_post, p.id_usuario, p.id_tipo_envio_post, p.texto, p.tipo, p.num_comentarios, p.fecha_publicacion, p.priv, p.vidupl_file, p.vidupl_img, p.vidmov_file, p.vidmov_img, p.vidcam_file, p.vidcam_img, p.vid_id_youtube, p.vid_tit_youtube, p.vid_thumb_youtube, p.vid_time_youtube, p.mus_id_youtube, p.mus_tit_youtube, p.mus_time_youtube, p.img_fichero, p.link_tit, p.link_url, p.link_texto, p.link_img, p.evento_tit, p.evento_categoria, p.evento_tipo, p.evento_fecha_inicio, p.evento_fecha_fin, p.evento_telefono_contacto, p.evento_email, p.evento_pagina_web, p.evento_img_site, p.evento_img_site_size, p.map_direccion, p.evento_cancelado, p.map_latitud, p.map_longitud, p.map_zoom, p.map_id_pais FROM POSTS p JOIN CONTACTOS c ON p.id_usuario=c.id_agregante WHERE (p.priv=0 OR p.priv=1) AND p.eliminado=0 AND p.eliminado_baja=0 AND p.es_spam=0 AND c.id_agregado=31436 AND c.activo=1 ) UNION DISTINCT (SELECT p.id_post, p.id_usuario, p.id_tipo_envio_post, p.texto, p.tipo, p.num_comentarios, p.fecha_publicacion, p.priv, p.vidupl_file, p.vidupl_img, p.vidmov_file, p.vidmov_img, p.vidcam_file, p.vidcam_img, p.vid_id_youtube, p.vid_tit_youtube, p.vid_thumb_youtube, p.vid_time_youtube, p.mus_id_youtube, p.mus_tit_youtube, p.mus_time_youtube, p.img_fichero, p.link_tit, p.link_url, p.link_texto, p.link_img, p.evento_tit, p.evento_categoria, p.evento_tipo, p.evento_fecha_inicio, p.evento_fecha_fin, p.evento_telefono_contacto, p.evento_email, p.evento_pagina_web, p.evento_img_site, p.evento_img_site_size, p.map_direccion, p.evento_cancelado, p.map_latitud, p.map_longitud, p.map_zoom, p.map_id_pais FROM POSTS p WHERE p.id_usuario=31436 AND (p.priv=0 OR p.priv=1) AND p.eliminado=0 AND p.eliminado_baja=0 AND p.es_spam=0 ) ORDER BY id_post DESC