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" } ] } } }