Cuando empiezas a trabajar con MySQL, todo parece ir bien… hasta que tu tabla crece.

Un día tienes 20 registros.

Otro día 200.

Y de repente, 10 000 filas cargándose en una sola consulta.

Ahí es cuando muchos proyectos empiezan a fallar silenciosamente.

En este artículo aprenderás qué son LIMIT y OFFSET, cómo usarlos correctamente, por qué protegen tu servidor, y cómo aplicarlos en escenarios reales como blogs, paneles de administración y sistemas de paginación.

📌 Si aún no dominas los comandos básicos, te recomiendo empezar por

👉 “Primeros comandos MySQL que debes memorizar sí o sí



🔹 ¿Qué es LIMIT en MySQL?

LIMIT indica cuántos registros quieres recibir de una consulta.

SELECT * FROM posts LIMIT 10;

📌 Traducción humana:

“Dame solo 10 filas”.

Sin LIMIT, MySQL devuelve todo, aunque no lo necesites.



🔹 ¿Qué es OFFSET?

OFFSET indica cuántos registros se deben saltar antes de empezar a devolver resultados.

SELECT * FROM posts LIMIT 10 OFFSET 20;

📌 Traducción humana:

“Sáltate los primeros 20 registros y luego dame 10”.

🧠 Ejemplo visual (muy importante)

Supongamos que tienes 50 posts:

ID	Título
1	Post A
2	Post B
…	…
21	Post U
30	Post AD


LIMIT 10 OFFSET 20

👉 Devuelve del 21 al 30



📄 Paginación real

Página 1

SELECT * FROM posts
ORDER BY created_at DESC
LIMIT 10 OFFSET 0;

Página 2

SELECT * FROM posts
ORDER BY created_at DESC
LIMIT 10 OFFSET 10;

Página 3

SELECT * FROM posts
ORDER BY created_at DESC
LIMIT 10 OFFSET 20;

Regla mental fácil 🧩

OFFSET = (página - 1) × registros_por_página

🚀 ¿Por qué LIMIT y OFFSET mejoran el rendimiento?

❌ Consulta peligrosa

SELECT * FROM posts;
  • Carga toda la tabla
  • Usa mucha memoria
  • PHP procesa datos innecesarios
  • Lento para el usuario
  • ❌ Mala experiencia

✅ Consulta optimizada

SELECT * FROM posts
ORDER BY created_at DESC
LIMIT 10;

✔️ Menos CPU

✔️ Menos RAM

✔️ Respuesta rápida

✔️ Mejor SEO



⚠️ Error común: usar LIMIT sin ORDER BY

SELECT * FROM posts LIMIT 10;

Esto NO garantiza el orden.

Hoy puede funcionar, mañana no.

✔️ Siempre:

SELECT * FROM posts
ORDER BY created_at DESC
LIMIT 10 OFFSET 20;

✂️ Sintaxis corta (equivalente)

LIMIT 20, 10;

Es lo mismo que:

LIMIT 10 OFFSET 20;

📌 Recomendación profesional:

Usa LIMIT + OFFSET, es más clara y legible.


🧩 Ejemplo real en PHP (PDO)

$porPagina = 10;
$pagina = max(1, (int)$_GET['page']);
$offset = ($pagina - 1) * $porPagina;

$stmt = $pdo->prepare("
  SELECT *
  FROM posts
  ORDER BY created_at DESC
  LIMIT :limit OFFSET :offset
");

$stmt->bindValue(':limit', $porPagina, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();

$posts = $stmt->fetchAll();



🔥 LIMIT y OFFSET en proyectos grandes

Cuando una tabla crece mucho (cientos de miles o millones de filas):

  • OFFSET alto puede volverse lento
  • En esos casos se usan paginación por cursor

👉 Tema avanzado que veremos en otro artículo 😉



🧠 Resumen rápido

  • LIMIT controla cuántos resultados
  • OFFSET controla desde dónde empiezan
  • Son esenciales para:
  • blogs
  • paneles admin
  • dashboards
  • SEO
  • Siempre usar con ORDER BY