{"id":102,"date":"2026-01-16T19:58:30","date_gmt":"2026-01-16T23:58:30","guid":{"rendered":"https:\/\/juredev.com\/blog\/?p=102"},"modified":"2026-02-10T18:25:25","modified_gmt":"2026-02-10T22:25:25","slug":"domina-las-consultas-sql-en-mysql-y-mariadb-guia-practica-desde-cero-para-tablas-grandes","status":"publish","type":"post","link":"https:\/\/juredev.com\/blog\/2026\/01\/domina-las-consultas-sql-en-mysql-y-mariadb-guia-practica-desde-cero-para-tablas-grandes\/","title":{"rendered":"Domina las consultas SQL en MySQL y MariaDB: Gu\u00eda pr\u00e1ctica desde cero para tablas grandes"},"content":{"rendered":"\n<p>Imagina que una consulta que deber\u00eda responder en menos de un segundo termina tardando 30 segundos. No es solo molesto: satura el servidor, sube la factura de hosting (o de cloud), y lo peor\u2026 hace que los usuarios cierren la pesta\u00f1a y se vayan.<\/p>\n\n\n\n<p>Esta gu\u00eda va dirigida a desarrolladores que est\u00e1n empezando con <strong><a href=\"https:\/\/juredev.com\/blog\/tag\/sql\/\" data-type=\"link\" data-id=\"https:\/\/juredev.com\/blog\/tag\/sql\/\">SQL<\/a><\/strong> (o que ya lo usan pero sienten que les falta pulir), y que trabajan con <strong><a href=\"https:\/\/www.mysql.com\/\" data-type=\"link\" data-id=\"https:\/\/www.mysql.com\/\">MySQL<\/a><\/strong> o <strong><a href=\"https:\/\/www.mysql.com\/\" data-type=\"link\" data-id=\"https:\/\/www.mysql.com\/\">MariaDB<\/a><\/strong>. La idea es que salgas de aqu\u00ed con herramientas reales y aplicables ya mismo para que tus consultas en tablas grandes dejen de ser un dolor de cabeza, sin necesidad de volverte experto en administraci\u00f3n de bases de datos ni tocar configuraciones muy avanzadas del servidor.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Por qu\u00e9 las consultas lentas duelen (y duelen en serio)<\/h2>\n\n\n\n<p>Una query ineficiente no es solo \u201clenta\u201d. Tiene consecuencias reales:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Una consulta que tarda 10 segundos y se ejecuta varias veces al d\u00eda en una tabla de 1 mill\u00f3n de filas puede costarte f\u00e1cilmente 50 d\u00f3lares o m\u00e1s al mes extra en infraestructura.<\/li>\n\n\n\n<li>En un sistema de gesti\u00f3n de log\u00edstica para una naviera global, que despu\u00e9s de varios a\u00f1os ha acumulado tablas con millones de registros sobre env\u00edos de contenedores, rutas mar\u00edtimas y tracking en tiempo real, cada segundo adicional se traduce en menos agilidad para el equipo operativo y peor experiencia para los clientes que esperan actualizaciones instant\u00e1neas.<\/li>\n<\/ul>\n\n\n\n<p>En entornos con <strong>MySQL<\/strong> o <strong>MariaDB<\/strong> mal aprovechados, estos problemas se acumulan r\u00e1pido. Optimizar consultas no es un \u201cnice to have\u201d: con el tiempo se vuelve una habilidad b\u00e1sica si quieres que tu aplicaci\u00f3n escale sin morir en el intento.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lo primero que debes tener claro antes de optimizar<\/h2>\n\n\n\n<p>Estos son los conceptos fundamentales. Si los aplicas consistentemente, la mayor\u00eda de tus problemas de velocidad mejoran sin tocar nada m\u00e1s.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. SELECT: pide solo lo que vas a usar<\/h3>\n\n\n\n<p>Cada columna que traes consume memoria, CPU y ancho de banda. Suena obvio, pero es de lo que m\u00e1s se peca.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Mala idea: trae TODO\nSELECT * FROM envios WHERE fecha &gt; '2025-01-01';\n\n-- Mucho mejor: solo lo que necesitas\nSELECT id_contenedor, destino, estado\nFROM envios\nWHERE fecha &gt; '2025-01-01';<\/code><\/pre>\n\n\n\n<p>Regla simple para recordar: si no vas a mostrarla ni usarla en el c\u00f3digo, no la selecciones. Punto.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. WHERE: filtra lo m\u00e1s temprano posible<\/h3>\n\n\n\n<p>Cuanto antes reduzcas las filas que <strong>MySQL<\/strong>\/<strong>MariaDB<\/strong> tiene que procesar, mejor.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Muy buena pr\u00e1ctica cuando hay \u00edndice en fecha\nWHERE fecha BETWEEN '2025-01-01' AND '2025-12-31';<\/code><\/pre>\n\n\n\n<p>Error cl\u00e1sico que mata el rendimiento: aplicar funciones sobre la columna que est\u00e1s filtrando.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Esto casi siempre impide usar \u00edndice \u2192 full table scan\nWHERE YEAR(fecha) = 2025;\n\n-- Deja que el motor use el \u00edndice\nWHERE fecha &gt;= '2025-01-01' AND fecha &lt; '2026-01-01';<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. JOIN: hazlo con cabeza<\/h3>\n\n\n\n<p>Un <strong>JOIN<\/strong> mal puesto puede convertirse en producto cartesiano accidental y arruinar el servidor.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Peligroso: sin condici\u00f3n \u2192 explosi\u00f3n de filas\nSELECT e.estado, n.nombre\nFROM envios e\nJOIN navieras n;\n\n-- Correcto y eficiente\nSELECT e.estado, n.nombre\nFROM envios e\nINNER JOIN navieras n ON e.naviera_id = n.id\nWHERE e.fecha &gt;= '2025-01-01';<\/code><\/pre>\n\n\n\n<p><strong>Tip que salva vidas: <\/strong>aplica los filtros m\u00e1s restrictivos antes del <strong>JOIN<\/strong> siempre que puedas. <strong>MySQL<\/strong>\/<strong>MariaDB<\/strong> lo agradece.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">T\u00e9cnicas f\u00e1ciles que dan resultados inmediatos<\/h2>\n\n\n\n<p>Estas son las que puedes implementar hoy y ver mejoras en minutos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Pon LIMIT casi siempre<\/h3>\n\n\n\n<p>Sobre todo en listados, paneles admin, autocompletados, APIs de paginaci\u00f3n\u2026<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT id, destino, fecha\nFROM envios\nORDER BY fecha DESC\nLIMIT 50 OFFSET 0;<\/code><\/pre>\n\n\n\n<p>Sin <strong>LIMIT<\/strong>, el motor puede intentar ordenar y preparar millones de filas solo para que tu frontend muestre 20.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Desp\u00eddete del SELECT *<\/h3>\n\n\n\n<p>Parece inofensivo\u2026 hasta que la tabla tiene 40 columnas y 2 millones de filas.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Tr\u00e1fico innecesario (puede ser 80\u201390% m\u00e1s datos)\nSELECT * FROM contenedores;\n\n-- Solo lo esencial\nSELECT id, tipo, capacidad, estado_actual\nFROM contenedores\nWHERE activo = 1;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. \u00cdndices: tus mejores amigos (pero sin abusar)<\/h3>\n\n\n\n<p>Crea \u00edndices en las columnas que m\u00e1s usas en:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>WHERE<\/li>\n\n\n\n<li>JOIN \u2026 ON<\/li>\n\n\n\n<li>ORDER BY<\/li>\n\n\n\n<li>GROUP BY<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE INDEX idx_envios_fecha ON envios(fecha);\nCREATE INDEX idx_envios_naviera_fecha ON envios(naviera_id, fecha);<\/code><\/pre>\n\n\n\n<p><strong>Regla de oro:<\/strong> empieza con pocos \u00edndices bien pensados. Demasiados \u00edndices ralentizan los <strong>INSERT<\/strong>\/<strong>UPDATE<\/strong>\/<strong>DELETE<\/strong>. Analiza primero con <strong><a href=\"https:\/\/mariadb.com\/docs\/server\/reference\/sql-statements\/administrative-sql-statements\/analyze-and-explain-statements\/explain\" data-type=\"link\" data-id=\"https:\/\/mariadb.com\/docs\/server\/reference\/sql-statements\/administrative-sql-statements\/analyze-and-explain-statements\/explain\">EXPLAIN<\/a><\/strong> cu\u00e1les se usan realmente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. GROUP BY inteligente<\/h3>\n\n\n\n<p>Aseg\u00farate de filtrar antes de agrupar y que las columnas de filtro tengan \u00edndice.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT naviera_id, SUM(costo) AS total_costo, COUNT(*) AS cantidad_envios\nFROM envios\nWHERE fecha &gt;= '2025-01-01' AND fecha &lt; '2026-01-01'\nGROUP BY naviera_id\nHAVING total_costo &gt; 1000000;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Caso real: antes vs despu\u00e9s (tabla de 2.5 millones de filas)<\/h2>\n\n\n\n<p><strong>Antes<\/strong> (consulta t\u00edpica que duele):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT *\nFROM envios\nWHERE YEAR(fecha) = 2025;\n-- &gt; 18.7 segundos<\/code><\/pre>\n\n\n\n<p><strong>Despu\u00e9s<\/strong> (peque\u00f1os cambios):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT id, destino, naviera_id, fecha\nFROM envios\nWHERE fecha &gt;= '2025-01-01'\n  AND fecha &lt; '2026-01-01'\nLIMIT 100;\n-- &gt; 0.23 segundos<\/code><\/pre>\n\n\n\n<p><strong>Reducci\u00f3n<\/strong> \u2248 98% del tiempo. Mismo resultado \u00fatil, servidor feliz.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Herramientas gratuitas que te van a ayudar (sin gastar un centavo)<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Herramienta<\/th><th>Ideal para<\/th><th>Por qu\u00e9 usarla<\/th><\/tr><tr><td>phpMyAdmin<\/td><td>Hosting compartido, principiantes<\/td><td>F\u00e1cil de instalar, visual, muy usado en cPanel<\/td><\/tr><tr><td>DBeaver<\/td><td>Cualquier entorno (MySQL, MariaDB, PostgreSQL\u2026)<\/td><td>Multiplataforma, autocompletado excelente, gratis<\/td><\/tr><tr><td>MySQL Workbench<\/td><td>MySQL \/ MariaDB puro<\/td><td>Oficial de Oracle, muy bueno para modelado y EXPLAIN<\/td><\/tr><tr><td>Adminer<\/td><td>Servidores livianos<\/td><td>Un solo archivo PHP, ultra ligero<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Elige la que mejor se adapte a tu flujo. <strong>DBeaver<\/strong> y <strong>Adminer<\/strong> son mis favoritas para desarrollo diario.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tu pr\u00f3ximo paso (elige uno solo)<\/h2>\n\n\n\n<p>No intentes aplicar todo de una. Escoge una sola t\u00e9cnica de las que viste aqu\u00ed que puedas aplicar hoy en la consulta m\u00e1s lenta que tengas en tu proyecto.<\/p>\n\n\n\n<p>Muchas veces los resultados se ven en cuesti\u00f3n de minutos: menos carga en el servidor, respuestas m\u00e1s r\u00e1pidas, usuarios m\u00e1s contentos, menos dolores de cabeza.<\/p>\n\n\n\n<p>\u00a1Gracias por leer hasta aqu\u00ed! Sigamos codificando.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Imagina que una consulta que deber\u00eda responder en menos de un segundo termina tardando 30 segundos. No es solo molesto: satura el servidor, sube la factura de hosting (o de cloud), y lo peor\u2026 hace que los usuarios cierren la pesta\u00f1a y se vayan. Esta gu\u00eda va dirigida a desarrolladores que est\u00e1n empezando con SQL [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[20],"class_list":["post-102","post","type-post","status-publish","format-standard","hentry","category-desarrollo","tag-sql"],"_links":{"self":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts\/102","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/comments?post=102"}],"version-history":[{"count":0,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts\/102\/revisions"}],"wp:attachment":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/media?parent=102"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/categories?post=102"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/tags?post=102"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}