Volver a MySQL Intermedio
Particionamiento y Sharding en MySQL
Tipos de Partición
-- Partición por LISTA (por región/estado)
CREATE TABLE pedidos (
id INT NOT NULL AUTO_INCREMENT,
region VARCHAR(20) NOT NULL,
monto DECIMAL(10,2),
PRIMARY KEY (id, region)
)
PARTITION BY LIST COLUMNS (region) (
PARTITION p_americas VALUES IN ('MX', 'US', 'CA', 'BR'),
PARTITION p_europa VALUES IN ('DE', 'FR', 'ES'),
PARTITION p_asia VALUES IN ('JP', 'CN', 'KR')
);
-- Partición por HASH (distribución uniforme)
CREATE TABLE eventos_usuario (
id BIGINT NOT NULL AUTO_INCREMENT,
user_id INT NOT NULL,
evento VARCHAR(100),
PRIMARY KEY (id, user_id)
)
PARTITION BY HASH(user_id) PARTITIONS 8;
Mantenimiento de Particiones
-- Agregar nueva partición
ALTER TABLE ventas ADD PARTITION (
PARTITION p2025 VALUES LESS THAN (TO_DAYS('2026-01-01'))
);
-- Eliminar partición antigua (¡borrado instantáneo!)
ALTER TABLE ventas DROP PARTITION p2022;
-- Intercambiar partición con tabla de staging (carga masiva)
CREATE TABLE ventas_2023_staging LIKE ventas;
-- ... cargar datos en staging ...
ALTER TABLE ventas EXCHANGE PARTITION p2023 WITH TABLE ventas_2023_staging;
-- Estadísticas de particiones
SELECT PARTITION_NAME, TABLE_ROWS, DATA_LENGTH
FROM information_schema.PARTITIONS
WHERE TABLE_SCHEMA = 'mydb' AND TABLE_NAME = 'ventas';
ProxySQL para Separar Lecturas/Escrituras
-- Configurar servidores en ProxySQL admin
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES
(0, 'primary', 3306),
(1, 'replica1', 3306),
(1, 'replica2', 3306);
-- Reglas: SELECTs a réplicas, escrituras al primario
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup) VALUES
(1, 1, '^SELECT', 1),
(2, 1, '^SELECT .* FOR UPDATE', 0);
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
Sharding a Nivel de Aplicación
import hashlib
SHARDS = {
0: 'mysql-shard-0:3306',
1: 'mysql-shard-1:3306',
2: 'mysql-shard-2:3306',
3: 'mysql-shard-3:3306',
}
def obtener_shard(user_id: int) -> str:
clave = hashlib.md5(str(user_id).encode()).hexdigest()
num_shard = int(clave, 16) % len(SHARDS)
return SHARDS[num_shard]
conexion = connect(obtener_shard(user_id))
Vitess para Escalado Horizontal
# VSchema: definir clave de sharding
{
"sharded": true,
"vindexes": {
"hash": { "type": "hash" }
},
"tables": {
"pedidos": {
"column_vindexes": [
{ "column": "cliente_id", "name": "hash" }
]
}
}
}