📌 Índices y Particiones en Amazon DynamoDB
Amazon DynamoDB es una base de datos NoSQL que maneja datos en formato de clave-valor y documentos. Para mejorar el rendimiento y la flexibilidad de consultas, DynamoDB utiliza índices y particiones de manera eficiente.
1️⃣ Particiones en DynamoDB
DynamoDB almacena datos en particiones físicas distribuidas automáticamente para mejorar la escalabilidad y la velocidad.
🔹 ¿Cómo funcionan las particiones?
- Cada elemento en una tabla tiene una clave de partición (Partition Key).
- DynamoDB distribuye los datos entre múltiples particiones físicas según el valor de la clave de partición.
- El tamaño máximo de una partición es 10 GB y puede manejar hasta 3,000 RCU (Read Capacity Units) y 1,000 WCU (Write Capacity Units).
✅ Consejo: Para evitar el "hotspotting" (carga desbalanceada en algunas particiones), usa claves de partición con valores bien distribuidos.
2️⃣ Índices en DynamoDB
Los índices permiten realizar consultas más eficientes sin escanear toda la tabla. DynamoDB ofrece dos tipos principales de índices:
🔹 Índice Secundario Global (GSI - Global Secondary Index)
- Permite consultas sobre atributos que NO son clave de partición.
- Se define con una clave de partición y opcionalmente una clave de ordenamiento (Sort Key).
- Los datos se almacenan en particiones separadas, lo que mejora el rendimiento de búsqueda.
- Se puede definir con diferente capacidad de lectura/escritura que la tabla principal.
✅ Ejemplo:
Supongamos que tenemos una tabla Usuarios con la siguiente estructura:
user_id (PK)nombreemailedadU001Mariomario@email.com30U002Anaana@email.com25
Si queremos buscar usuarios por email, creamos un GSI con email como clave de partición:
{
"IndexName": "EmailIndex",
"KeySchema": [
{ "AttributeName": "email", "KeyType": "HASH" }
],
"Projection": { "ProjectionType": "ALL" }
}
Ahora podemos consultar Usuarios por email sin recorrer toda la tabla.
🔹 Índice Secundario Local (LSI - Local Secondary Index)
- Solo se puede definir al momento de crear la tabla.
- Usa la misma clave de partición que la tabla principal, pero permite una clave de ordenamiento diferente.
- Optimizado para consultas dentro de un mismo valor de clave de partición.
- Comparte capacidad de lectura/escritura con la tabla principal.
✅ Ejemplo:
Supongamos que tenemos una tabla Pedidos con la siguiente estructura:
cliente_id (PK)pedido_id (SK)fechatotalC001P10012025-03-0150C001P10022025-03-0580
Si queremos buscar pedidos de un cliente ordenados por fecha, creamos un LSI con fecha como clave de ordenamiento:
{
"IndexName": "FechaIndex",
"KeySchema": [
{ "AttributeName": "cliente_id", "KeyType": "HASH" },
{ "AttributeName": "fecha", "KeyType": "RANGE" }
],
"Projection": { "ProjectionType": "ALL" }
}
Ahora podemos buscar todos los pedidos de un cliente en orden de fecha.
📌 Diferencias Clave entre GSI y LSI
CaracterísticaGSI (Global Secondary Index)LSI (Local Secondary Index)Se puede crear después de la tabla✅ Sí❌ NoClave de partición diferente a la tabla✅ Sí❌ NoClave de ordenamiento diferente✅ Opcional✅ ObligatorioCapacidad de lectura/escritura separada✅ Sí❌ NoMáximo permitido por tabla🔹 20 por tabla (por defecto 5)🔹 5 por tabla
📌 Conclusión
✅ Usa Particiones bien distribuidas para evitar puntos calientes en la base de datos.
✅ Usa GSI si necesitas buscar por atributos distintos a la clave primaria.
✅ Usa LSI si necesitas diferentes claves de ordenamiento dentro de la misma partición.