0Pricing
AWS Solutions Architect · Lección

Índices secundarios globales e índices secundarios locales

Añada GSI y LSI para admitir patrones de consulta alternativos sin duplicar tablas.

Índices secundarios globales e índices secundarios locales es una lección gratuita de AWS Solutions Architect en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AWS Solutions Architect, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AWS Solutions Architect incluye 4 lecciones en total.

Por qué existen los índices secundarios

La clave principal de DynamoDB define la única ruta de consulta eficiente de una tabla. Si necesita consultar los elementos mediante un atributo diferente —por ejemplo, si desea encontrar todos los pedidos de un ID de producto cuando la clave de partición de la tabla es CustomerId— tendría que realizar un Scan costoso sin un índice secundario.

Los índices secundarios resuelven este problema manteniendo una copia independiente de los datos, actualizada automáticamente y estructurada en torno a una clave diferente. DynamoDB ofrece dos tipos: Global Secondary Indexes (GSI) y Local Secondary Indexes (LSI), cada uno con distintas ventajas y desventajas.

Conceptos básicos de Global Secondary Index (GSI)

Un Global Secondary Index permite definir una clave de partición completamente diferente (y, opcionalmente, una clave de ordenación) de la tabla base. El GSI es verdaderamente global: abarca todas las particiones de la tabla base. Puede consultar un GSI para encontrar elementos mediante cualquier atributo que defina como clave de partición del GSI.

Los GSI tienen su propio rendimiento aprovisionado (o heredan el modo bajo demanda), independiente del de la tabla base. Puede crear hasta 20 GSI por tabla y añadirlos o eliminarlos en cualquier momento en una tabla existente.

# Create a table with a GSI on ProductId
aws dynamodb create-table \
  --table-name Orders \
  --attribute-definitions \
    AttributeName=OrderId,AttributeType=S \
    AttributeName=ProductId,AttributeType=S \
    AttributeName=OrderDate,AttributeType=S \
  --key-schema AttributeName=OrderId,KeyType=HASH \
  --global-secondary-indexes '[
    {
      "IndexName": "ProductId-OrderDate-index",
      "KeySchema": [
        {"AttributeName": "ProductId", "KeyType": "HASH"},
        {"AttributeName": "OrderDate", "KeyType": "RANGE"}
      ],
      "Projection": {"ProjectionType": "ALL"},
      "ProvisionedThroughput": {"ReadCapacityUnits": 10, "WriteCapacityUnits": 5}
    }
  ]' \
  --provisioned-throughput ReadCapacityUnits=10,WriteCapacityUnits=5

Conceptos básicos de Local Secondary Index (LSI)

Un Local Secondary Index comparte la misma clave de partición que la tabla base, pero utiliza una clave de ordenación diferente. Los LSI son «locales» porque solo realizan consultas dentro de una única partición (elementos con la misma clave de partición). Esto hace que los LSI sean ideales para consultar los pedidos de un cliente específico ordenados por distintos atributos.

Los LSI deben definirse en el momento de crear la tabla; no puede añadirlos ni eliminarlos posteriormente. Cada tabla puede tener hasta 5 LSI. Los LSI comparten la capacidad aprovisionada de la tabla base (sin rendimiento independiente) y están sujetos al límite de almacenamiento de 10 GB por clave de partición para la combinación de los datos de la tabla base y del LSI.

# Create a table with an LSI (at creation time only)
aws dynamodb create-table \
  --table-name Orders \
  --attribute-definitions \
    AttributeName=CustomerId,AttributeType=S \
    AttributeName=OrderDate,AttributeType=S \
    AttributeName=TotalAmount,AttributeType=N \
  --key-schema \
    AttributeName=CustomerId,KeyType=HASH \
    AttributeName=OrderDate,KeyType=RANGE \
  --local-secondary-indexes '[{
    "IndexName": "TotalAmount-index",
    "KeySchema": [
      {"AttributeName": "CustomerId", "KeyType": "HASH"},
      {"AttributeName": "TotalAmount", "KeyType": "RANGE"}
    ],
    "Projection": {"ProjectionType": "ALL"}
  }]' \
  --billing-mode PAY_PER_REQUEST

GSI frente a LSI: diferencias clave

A continuación se muestra una comparación lado a lado para facilitar el repaso del examen:

  • Clave de partición: la GSI puede diferir de la tabla base; la LSI debe coincidir con la tabla base
  • Clave de ordenación: ambas admiten una clave de ordenación distinta de la de la tabla base
  • Momento de creación: la GSI puede crearse en cualquier momento; la LSI, solo al crear la tabla
  • Rendimiento: la GSI tiene su propio rendimiento; la LSI comparte el rendimiento de la tabla base
  • Coherencia: las lecturas de la GSI solo admiten coherencia eventual; las lecturas de la LSI pueden tener coherencia fuerte
  • Límites: hasta 20 GSIs; hasta 5 LSIs por tabla

Tipos de proyección

Al crear un índice, se eligen los atributos que se proyectan (copian) en él:

  • KEYS_ONLY: solo la clave principal de la tabla base y la clave del índice; es el índice más pequeño, pero requiere llamadas adicionales a GetItem para obtener atributos que no sean claves
  • INCLUDE: los atributos de clave más una lista específica de atributos adicionales que se indiquen; ofrece un equilibrio entre el tamaño y el patrón de acceso
  • ALL: todos los atributos se proyectan en el índice; es la opción más flexible, pero implica un mayor coste de almacenamiento y escritura

Elija el tipo de proyección según los atributos que realmente necesiten sus consultas. Proyectar atributos innecesarios desperdicia WCUs en cada escritura; proyectar menos atributos de los necesarios obliga a realizar llamadas adicionales a GetItem para obtener los atributos que no están en el índice.

Consultar una GSI

Consultar una GSI utiliza la misma API Query, pero especifica el parámetro --index-name. La consulta se ejecuta sobre el esquema de claves de la GSI, no sobre el de la tabla base. Las consultas a una GSI siempre tienen coherencia eventual: la GSI se actualiza de forma asíncrona después de las escrituras en la tabla base, por lo que existe un breve retraso.

Si un elemento de la tabla base no tiene el atributo de clave de partición de la GSI, no se incluye en ella (patrón de índice disperso). Esta es una técnica eficaz para indexar solo un subconjunto de elementos, como todos los pedidos cuyo estado sea PENDING si la clave de partición de la GSI es Status.

# Query the GSI for all orders for a product in 2026
aws dynamodb query \
  --table-name Orders \
  --index-name ProductId-OrderDate-index \
  --key-condition-expression 'ProductId = :pid AND OrderDate BETWEEN :start AND :end' \
  --expression-attribute-values \
    '{":pid":{"S":"prod-abc"},":start":{"S":"2026-01-01"},":end":{"S":"2026-12-31"}}'

Patrón de índice disperso

Un índice disperso aprovecha el hecho de que DynamoDB solo proyecta elementos en una GSI si tienen un valor para la clave de partición de la GSI. Al definir la clave de partición de la GSI sobre un atributo que solo tienen algunos elementos, se crea un índice que contiene únicamente ese subconjunto.

Ejemplo: en una tabla Orders, solo los pedidos no enviados tienen un atributo PendingShipmentDate. Una GSI sobre PendingShipmentDate contiene de forma natural únicamente los pedidos no enviados, lo que la convierte en una forma muy eficiente de consultar todos los pedidos pendientes sin examinar toda la tabla.

Fragmentación de escrituras con sobrecarga de GSI

La sobrecarga de GSI es una técnica avanzada de diseño de tabla única en la que se almacenan distintos tipos de entidades en una misma tabla y se utiliza un atributo de clave de GSI genérico (por ejemplo, GSI1PK y GSI1SK), cuyos valores siguen distintos patrones según el tipo de elemento. De este modo, cada tipo de entidad dispone de su propia ruta de consulta eficiente a través de una única GSI.

Ejemplo: para los elementos User, establezca GSI1PK = 'COUNTRY#US' y GSI1SK = username; para los elementos Order, establezca GSI1PK = 'STATUS#PENDING' y GSI1SK = orderDate. Consultar la GSI con el prefijo adecuado recupera de forma eficiente el tipo de entidad de destino.

Limitación de índices y capacidad

La limitación de una GSI se produce de forma independiente de la tabla base. Si las WCUs aprovisionadas de la GSI son demasiado bajas, las escrituras de los elementos que se proyectan en la GSI sufrirán limitación, incluso si la tabla base tiene capacidad de sobra. Supervise ConsumedWriteCapacityUnits y ThrottledRequests por separado para cada GSI.

Un error frecuente es aprovisionar la GSI con una capacidad inferior a la de la tabla base y experimentar después limitaciones cuando un patrón de escritura aumenta repentinamente la tasa de escritura de la GSI. Utilice Auto Scaling en las GSIs o elija el modo On-Demand para evitarlo.

Cuándo usar GSI, LSI o rediseñar

Directrices de decisión para el examen SAA-C03:

  • Necesita consultar por un atributo completamente diferente → GSI
  • Necesita consultar dentro de la misma partición, pero con un orden diferente, y lo sabe al crear la tabla → LSI
  • Necesita lecturas con coherencia fuerte sobre una clave de ordenación alternativa → LSI (es la única opción, ya que las GSIs tienen coherencia eventual)
  • Diez o más patrones de consulta distintos → considere el diseño de tabla única con sobrecarga de GSI en lugar de muchas tablas independientes
  • Solo necesita recuperar todos los elementos para analizarlos → reconsidere si DynamoDB es la base de datos adecuada

Eliminación y relleno de GSIs

Puede eliminar una GSI en cualquier momento sin afectar a la tabla base. Al añadir una GSI nueva a una tabla existente, DynamoDB rellena el índice de forma asíncrona mediante un examen de la tabla base; en tablas grandes, esto puede tardar desde varios minutos hasta varias horas. Durante el relleno, la tabla base sigue estando completamente disponible para lecturas y escrituras.

Puede supervisar el progreso del relleno en la consola o mediante la API DescribeTable, comprobando el campo IndexStatus del índice: tendrá el valor CREATING durante el relleno y ACTIVE cuando finalice. No consulte la GSI hasta que tenga el estado ACTIVE.

# Check GSI status during backfill
aws dynamodb describe-table \
  --table-name Orders \
  --query 'Table.GlobalSecondaryIndexes[*].{Name:IndexName,Status:IndexStatus}'

Comprobación rápida

Ponga a prueba su comprensión de los conceptos de AWS Solutions Architect (SAA-C03) de esta lección.

Resumen de la lección

En esta lección ha aprendido que las GSIs proporcionan claves de partición alternativas y pueden añadirse en cualquier momento, que las LSIs comparten la clave de partición base y deben definirse al crear la tabla y que los tipos de proyección controlan qué atributos se copian en el índice. Las GSIs admiten patrones de índice disperso y de sobrecarga para ofrecer flexibilidad avanzada en las consultas. A continuación, exploraremos DynamoDB Streams y Global Tables.

Preguntas frecuentes

¿La lección «Índices secundarios globales e índices secundarios locales» es gratis?

Sí — el texto completo de «Índices secundarios globales e índices secundarios locales» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AWS Solutions Architect, actualiza a CoddyKit PRO. El curso de AWS Solutions Architect incluye 4 lecciones en total.

¿Qué aprenderé en «Índices secundarios globales e índices secundarios locales»?

Añada GSI y LSI para admitir patrones de consulta alternativos sin duplicar tablas. Practicas AWS Solutions Architect con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar AWS Solutions Architect?

No se requiere experiencia previa. AWS Solutions Architect en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Índices secundarios globales e índices secundarios locales»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de AWS Solutions Architect?

Sí. Cada lección de AWS Solutions Architect incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Tablas, elementos y claves principales
  2. Capacidad aprovisionada frente a bajo demanda
  3. Índices secundarios globales e índices secundarios locales
  4. DynamoDB Streams y tablas globales
← Volver a AWS Solutions Architect