Amazon DynamoDB
Guía para desarrolladores (Versión de API 2012-08-10)

Uso de índices secundarios para mejorar el acceso a los datos

Amazon DynamoDB proporciona un acceso rápido a los elementos de una tabla especificando sus valores de clave principal. Sin embargo, muchas aplicaciones podrían beneficiarse de disponer de una o varias claves secundarias (o alternativas) para permitir un acceso eficiente a datos con otros atributos aparte de la clave principal. Para responder a esta necesidad, puede crear uno o varios índices secundarios en una tabla y emitir solicitudes Query o Scan para estos índices.

Un índice secundario es una estructura de datos que contiene un subconjunto de atributos de una tabla, además de una clave alternativa para admitir las operaciones Query. Puede recuperar datos del índice usando una operación Query prácticamente de la misma forma que Query se usa en una tabla. Una tabla puede tener varios índices secundarios, lo que permite a las aplicaciones obtener acceso a diferentes patrones de consulta.

nota

También se pueden utilizar operaciones Scan en los índices, de un modo bastante similar a como Scan se usaría en una tabla.

Cada índice secundario está asociado exactamente con una tabla de la que obtiene sus datos. Esta se denomina tabla base del índice. Al crear un índice, se define una clave alternativa para él (clave de partición y clave de ordenación). También se definen los atributos de la tabla base que se desea proyectar, o copiar, en el índice. DynamoDB copia estos atributos en el índice, junto con los atributos de clave principal de la tabla base. A partir de ese momento, puede consultar o examinar el índice exactamente igual que una tabla.

DynamoDB mantiene automáticamente todos los índices secundarios. Cuando se agregan, modifican o eliminan elementos en la tabla base, los índices basados en esa tabla se actualizan también para reflejar estos cambios.

DynamoDB admite dos tipos de índices secundarios:

  • Global secondary index: índice con una clave de partición y una clave de ordenación que pueden diferir de las claves de la tabla base. Un índices secundario global se considera "global" porque las consultas del índice pueden abarcar todos los datos de la tabla base para todas las particiones.

  • Índice secundario local: índice que tiene la misma clave de partición que la tabla base, pero una clave de ordenación distinta. Un local secondary index es "local" en el sentido de que el ámbito de todas sus particiones corresponde a una partición de tabla base que tiene el mismo valor de clave de partición.

Debe tener en cuenta los requisitos de la aplicación al determinar qué tipo de índice va a utilizar. En la tabla siguiente se muestran las principales diferencias entre un índices secundario global y un local secondary index.

Característica Índice secundario global Índice secundario local
Esquema de claves La clave principal de un índices secundario global puede ser simple (clave de partición) o compuesta (clave de partición y clave de ordenación). La clave principal de un local secondary index debe ser compuesta (clave de partición y clave de ordenación).
Atributos de clave La clave de partición y la clave de ordenación (si procede) del índice pueden ser cualesquiera atributos de tipo String, Number o Binary de la tabla base. La clave de partición del índice es el mismo atributo que la clave de partición de la tabla base. La clave de ordenación puede ser cualquier atributo de tipo String, Number o Binary de la tabla base.
Restricciones de tamaño por valor de clave de partición No se aplican restricciones de tamaño a los índices secundarios globales. Para cada valor de clave de partición, el tamaño total de todos los elementos indexados debe ser de 10 GB o menos.
Operaciones online con índices Los índices secundarios globales se pueden crear a la vez que se crea una tabla. También se puede agregar un nuevo índices secundario global a una tabla o eliminar un índices secundario global presente en ella. Para obtener más información, consulte Administración de índices secundarios globales. Los índices secundarios locales se crean a la vez que se crea la tabla. No se puede agregar un local secondary index a una tabla existente, ni tampoco se puede eliminar ningún local secondary index que ya exista.
Consultas y particiones Un índices secundario global permite realizar consultas en toda la tabla y en todas las particiones. Un local secondary index permite consultar una sola partición, según lo especificado por el valor de clave de partición de la consulta.
Consistencia de lectura Las consultas de índices secundarios globales solo admiten la consistencia final. Cuando se realiza una consulta en un local secondary index, se puede elegir entre la consistencia final o alta.
Consumo de desempeño provisionado Cada índices secundario global tiene sus propios ajustes de desempeño provisionado para la actividad de lectura y escritura. Las consultas o exámenes de un índices secundario global consumen unidades de capacidad del índice, no de la tabla base. Esto mismo sucede con las actualizaciones de los índices secundarios globales debidas a escrituras en la tabla. Las consultas o exámenes de un local secondary index consumen unidades de capacidad de lectura de la tabla base. Al escribir en una tabla, sus índices secundarios locales también se actualizan y estas actualizaciones consumen unidades de capacidad de escritura de la tabla base.
Atributos proyectados Cuando se consulta o examina un índices secundario global, solo se pueden solicitar los atributos que se han proyectado en él. DynamoDB no recupera ningún atributo de la tabla. Cuando se consulta o examina un local secondary index, se pueden solicitar los atributos que no se hayan proyectado en él. DynamoDB recupera automáticamente estos atributos de la tabla.

Si desea crear más de una tabla con índices secundarios, debe hacerlo de forma secuencial. Por ejemplo, tendría que crear la primera tabla y esperar a que su estado fuese ACTIVE, luego la siguiente tabla y esperar a que adquiriese el estado ACTIVE, y así sucesivamente. Si intenta crear simultáneamente más de una tabla con un índice secundario, DynamoDB devuelve una excepción LimitExceededException.

Para cada índice secundario, debe especificar lo siguiente:

  • El tipo de índice que se va a crear, que puede ser un índices secundario global o un local secondary index.

  • El nombre del índice. Las reglas de nomenclatura de los índices son las mismas que para las tablas, como se indica en Límites en DynamoDB. El nombre debe ser único para la tabla base al que está asociado, pero puede utilizar el mismo nombre para índices que estén asociados a tablas base distintas.

  • El esquema de claves del índice. Cada atributo del esquema de claves del índice debe ser un atributo de nivel superior debe de tipo String, Number y Binary. No se permiten otros tipos de datos, como los documentos y los conjuntos. Los demás requisitos del esquema de claves dependen del tipo de índice:

    • Si se trata de un índices secundario global, la clave de partición puede ser cualquier atributo escalar de la tabla base. La clave de ordenación es opcional y también puede ser cualquier atributo escalar de la tabla base.

    • Si se trata de un local secondary index, la clave de partición debe ser igual que la tabla de partición de la tabla base y la clave de ordenación debe ser un atributo sin clave de la tabla base.

  • Los atributos adicionales, si los hay, de la tabla base que se proyectarán en el índice. Estos atributos se agregan a los atributos de clave de la tabla, que se proyectan de forma automática en cada índice. Puede proyectar atributos de cualquier tipo de datos, incluidos escalares, documentos y conjuntos.

  • Los ajustes de desempeño provisionado del índice, si es preciso:

    • Para un índices secundario global, debe especificar los ajustes de unidades de capacidad de lectura y escritura. Estos ajustes de desempeño provisionado son independientes de los ajustes de la tabla base.

    • Para un local secondary index, no es preciso especificar los ajustes de unidades de capacidad de lectura y escritura. Todas las operaciones de lectura y escritura en un local secondary index consumen el desempeño provisionado configurado para su tabla base.

Para disfrutar de la máxima flexibilidad en las consultas, puede crear hasta 20 índices secundarios globales (límite predeterminado) y hasta 5 índices secundarios locales por tabla.

Para las siguientes regiones de AWS, el límite de los índices secundarios globales es de cinco:

  • AWS GovCloud (EE.UU. Este)

  • AWS GovCloud (EE.UU. Oeste)

  • UE Estocolmo

Para obtener un listado detallado de índices secundarios en una tabla, utilice la operación DescribeTable. DescribeTable devuelve el nombre, el tamaño de almacenamiento y el recuento de elementos de cada índice secundario de la tabla. Estos valores no se actualizan en tiempo real, sino aproximadamente cada seis horas.

Para obtener acceso a los datos de un índice secundario, utilice las operaciones Query o Scan. Debe especificar el nombre de la tabla base y el nombre del índice que se desea utilizar, los atributos que se devolverán en los resultados de la consulta y los filtros o las expresiones de condición que se van a aplicar. DynamoDB puede devolver los resultados en orden ascendente o descendente.

Al eliminar una tabla, todos los índices asociados a ella se eliminan también.

Para obtener las prácticas recomendadas, consulte Prácticas recomendadas para utilizar índices secundarios en DynamoDB.