Tema
¿Qué es MySQL?
Antes de instalar nada, conviene entender qué es MySQL, de dónde viene, en qué se diferencia de MariaDB, qué versión elegir y cómo funciona por dentro la conexión entre tu aplicación y el servidor. Con eso evitarás muchos dolores de cabeza cuando algo "no conecte".
Concepto
MySQL es un SGBD relacional (Sistema Gestor de Bases de Datos): un programa que guarda tus datos en tablas y responde consultas SQL. Funciona como un servidor: está corriendo todo el tiempo, escuchando peticiones de los programas (clientes) que se conectan a él.
Piensa en un restaurante:
- La cocina es el servidor MySQL: guarda los ingredientes (datos) y prepara los platillos (resultados).
- Los meseros son los clientes: tu app PHP, phpMyAdmin, la terminal. Llevan pedidos (consultas SQL) y regresan con la comida (filas).
- La puerta de la cocina es el puerto
3306.
Un poco de historia
| Año | Hito |
|---|---|
| 1995 | Michael Widenius y David Axmark lanzan MySQL en Suecia (la "My" viene de la hija de Widenius) |
| 2000s | Se vuelve la "M" del famoso stack LAMP (Linux, Apache, MySQL, PHP) |
| 2008 | Sun Microsystems compra MySQL AB |
| 2010 | Oracle compra Sun y con ella MySQL |
| 2009–2010 | Widenius crea MariaDB (por su otra hija, Maria) como fork comunitario |
| 2018 | MySQL 8.0: CTEs, funciones de ventana, roles, utf8mb4 por defecto |
| 2024 | MySQL 8.4 LTS (soporte a largo plazo) y la serie 9.x "innovation" |
MySQL vs MariaDB
MariaDB nació como una copia de MySQL y durante años fue un reemplazo directo. Con el tiempo se han separado un poco:
| Aspecto | MySQL | MariaDB |
|---|---|---|
| Dueño | Oracle (edición Community gratuita) | MariaDB Foundation (comunitaria) |
| Licencia | GPL + ediciones comerciales | GPL |
| Compatibilidad | — | Muy alta con MySQL 5.7; diferencias con 8.x |
| Motor por defecto | InnoDB | InnoDB (antes XtraDB) |
| Diferencias notables | JSON binario nativo, roles, caching_sha2_password | JSON es alias de LONGTEXT, motores extra (Aria, ColumnStore), secuencias |
| Dónde lo encuentras | Docker, nube (RDS, Cloud SQL), instaladores oficiales | XAMPP, muchas distros Linux, muchos hostings |
¿Cuál uso?
Para aprender y para el 95 % de proyectos web, da igual: el SQL y las herramientas son los mismos. Si tu hosting usa MariaDB, desarrolla localmente con MariaDB para evitar sorpresas. XAMPP trae MariaDB aunque el panel diga "MySQL".
Versiones
| Versión | Estado | Notas |
|---|---|---|
| 5.7 | Fin de soporte (oct. 2023) | Aún común en hostings viejos. Sin CTEs ni funciones de ventana |
| 8.0 | Fin de soporte en abril 2026 | Muy extendida |
| 8.4 LTS | Recomendada | Soporte a largo plazo; ideal para producción |
| 9.x | "Innovation" | Novedades cada pocos meses, soporte corto |
sql
-- ¿Qué versión tengo?
SELECT VERSION();
-- 8.4.2 → MySQL
-- 10.11.6-MariaDB → MariaDBBuena práctica
Usa la misma versión mayor en tu computadora y en el servidor de producción. Una consulta con funciones de ventana que funciona en tu MySQL 8.4 fallará en un hosting con MySQL 5.7.
Arquitectura cliente-servidor
txt
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ App PHP │ │ phpMyAdmin │ │ Terminal │ ← CLIENTES
│ (PDO) │ │ │ │ mysql -u ... │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ TCP :3306 │ │ socket local
└──────────────────┼──────────────────┘
┌──────▼───────┐
│ mysqld │ ← SERVIDOR (proceso/servicio)
│ ┌────────┐ │
│ │ InnoDB │ │ ← motor de almacenamiento
│ └───┬────┘ │
└──────┼───────┘
┌──────▼───────┐
│ /var/lib/mysql│ ← archivos de datos en disco
└──────────────┘Piezas clave:
| Pieza | Qué es |
|---|---|
mysqld | El servidor (daemon). Corre como servicio de Windows o de Linux |
mysql | El cliente de línea de comandos |
Puerto 3306 | Puerto TCP por defecto (MariaDB también) |
| Socket | En Linux, conexiones locales por archivo (/var/run/mysqld/mysqld.sock), más rápidas |
datadir | Carpeta donde viven los datos |
my.cnf / my.ini | Archivo de configuración (Linux / Windows) |
Datos para conectarte
Cualquier cliente necesita 5 datos:
| Dato | Ejemplo local | Ejemplo hosting |
|---|---|---|
| Host | 127.0.0.1 o localhost | localhost (desde el mismo servidor) |
| Puerto | 3306 | 3306 |
| Usuario | root (solo en tu PC) | cpuser_tienda |
| Contraseña | la que definiste | la que creaste en cPanel |
| Base de datos | tienda | cpuser_tienda |
localhost vs 127.0.0.1
En Linux y macOS, localhost hace que el cliente use el socket y 127.0.0.1 usa TCP. Para MySQL son conexiones distintas y un usuario puede tener permisos para una y no para la otra. Si "con localhost sí conecta y con 127.0.0.1 no" (o al revés), esa es la razón. Con Docker usa siempre 127.0.0.1.
Organización de los datos
txt
Servidor MySQL
├── base de datos "tienda" ← en MySQL, DATABASE = SCHEMA
│ ├── tabla clientes
│ ├── tabla productos
│ └── vista v_catalogo
├── base de datos "blog_wordpress"
├── mysql ← sistema: usuarios y permisos
├── information_schema ← metadatos (qué tablas y columnas existen)
├── performance_schema ← métricas de rendimiento
└── sys ← vistas amigables sobre performance_schemasql
SHOW DATABASES;
USE tienda;
SHOW TABLES;
-- Metadatos: columnas de una tabla
SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_schema = 'tienda' AND table_name = 'productos';No toques las bases del sistema
Nunca borres ni modifiques a mano mysql, information_schema, performance_schema ni sys. Para administrar usuarios usa CREATE USER y GRANT.
¿Dónde se usa MySQL?
- WordPress, WooCommerce, Joomla, Drupal, PrestaShop, Moodle: requieren MySQL/MariaDB.
- Laravel y la mayoría de frameworks PHP: MySQL es la opción por defecto en muchos tutoriales y hostings.
- Hosting compartido (cPanel, Plesk): casi siempre incluye MySQL/MariaDB y phpMyAdmin.
- Grandes empresas: Facebook/Meta, YouTube, Booking, GitHub y Uber lo han usado a gran escala.
- Nube: Amazon RDS / Aurora, Google Cloud SQL, Azure Database for MySQL, PlanetScale, DigitalOcean.
Fortalezas y limitaciones
| Fortalezas | Limitaciones |
|---|---|
| Muy rápido en lecturas típicas de sitios web | Menos tipos avanzados que PostgreSQL (sin arrays, enums limitados) |
| Disponible en cualquier hosting | CHECK solo desde 8.0.16; sin vistas materializadas |
| Enorme comunidad y documentación | Algunas conductas "permisivas" si el modo estricto está apagado |
| Replicación sencilla | Búsqueda de texto completo más básica |
| Herramientas maduras (Workbench, phpMyAdmin) |
Ejemplo: tu primera sesión
Una vez instalado (siguiente lección), así se ve una sesión en la terminal:
bash
mysql -u root -psql
-- Dentro del cliente mysql
SELECT VERSION(), CURRENT_USER(), NOW();
CREATE DATABASE tienda CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
USE tienda;
CREATE TABLE categorias (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(50) NOT NULL UNIQUE
) ENGINE=InnoDB;
INSERT INTO categorias (nombre) VALUES ('Electrónica'), ('Libros'), ('Hogar');
SELECT * FROM categorias;
EXIT;txt
+----+-------------+
| id | nombre |
+----+-------------+
| 1 | Electrónica |
| 3 | Hogar |
| 2 | Libros |
+----+-------------+
3 rows in set (0.00 sec)(¿Por qué salen en otro orden? Porque sin ORDER BY el orden no está garantizado: aquí MySQL leyó el índice UNIQUE de nombre, que está ordenado alfabéticamente.)
Ejercicios
- ¿Cuál es la diferencia entre
mysqldymysql? - Tu cliente tiene un hosting con "MySQL 5.7". ¿Qué funciones del curso de SQL no podrás usar?
- ¿Qué cinco datos necesitas para conectar una aplicación a MySQL?
- Ejecuta
SELECT VERSION();en el entorno que tengas (o en DB Fiddle eligiendo MySQL) e identifica si es MySQL o MariaDB.
Ver solución
mysqldes el servidor que guarda los datos y atiende conexiones;mysqles el programa cliente de terminal con el que te conectas a él.- CTEs (
WITH), CTEs recursivas, funciones de ventana (ROW_NUMBER,RANK,LAG...), roles, y losCHECKno se aplican (se ignoran). También el charset por defecto eralatin1. - Host, puerto, usuario, contraseña y nombre de la base de datos.
- Si la versión incluye el texto
MariaDB(por ejemplo10.11.6-MariaDB), es MariaDB; si es solo un número como8.4.2, es MySQL.
Resumen
- MySQL es un SGBD relacional cliente-servidor; el servidor (
mysqld) escucha en el puerto 3306. - MariaDB es un fork comunitario muy compatible; para proyectos web típicos funcionan igual.
- Usa MySQL 8.4 LTS (o la misma versión que tu servidor de producción).
- Para conectarte necesitas host, puerto, usuario, contraseña y base de datos.
- En MySQL, database y schema son sinónimos; no toques las bases del sistema.