Al crear una tabla Dynamodb, seleccione Claves primarias e Índices secundarios locales (LSI) para que una operación de consulta devuelva los elementos que desea.
Las operaciones de consulta solo admiten una evaluación de operador igual de la clave principal, pero condicional (=, <, <=,>,> =, entre, comenzar) en la clave de ordenación.
Las operaciones de escaneo son generalmente más lentas y costosas ya que la operación tiene que iterar a través de cada elemento de su tabla para obtener los elementos que está solicitando.
Ejemplo:
Table: CustomerId, AccountType, Country, LastPurchase
Primary Key: CustomerId + AccountType
En este ejemplo, puede utilizar una operación de consulta para obtener:
- Un CustomerId con un filtro condicional en AccountType
Debería usarse una operación de escaneo para regresar:
- Todos los clientes con un tipo de cuenta específico
- Elementos basados en filtros condicionales por país, es decir, todos los clientes de EE. UU.
- Elementos basados en filtros condicionales de LastPurchase, es decir, todos los clientes que realizaron una compra en el último mes
Para evitar operaciones de escaneo en operaciones de uso frecuente, se crea un índice secundario local (LSI) o un índice secundario global (GSI).
Ejemplo:
Table: CustomerId, AccountType, Country, LastPurchase
Primary Key: CustomerId + AccountType
GSI: AccountType + CustomerId
LSI: CustomerId + LastPurchase
En este ejemplo, una operación de consulta puede permitirle obtener:
- Un CustomerId con un filtro condicional en AccountType
- [GSI] Un filtro condicional en CustomerIds para un AccountType específico
- [LSI] Un CustomerId con un filtro condicional en LastPurchase
Tiene la clave de partición / clave principal de la tabla dynamodb como
customer_country
. Si usa consulta,customer_country
es el campo obligatorio para realizar la operación de consulta. Todos los filtros se pueden hacer solo los elementos que pertenecencustomer_country
.Si realiza un escaneo de tabla, el filtro se realizará en todas las claves de partición / claves primarias. Primero, obtuvo todos los datos y aplicó el filtro después de obtenerlos de la tabla.
p.ej:
aquí
customer_country
está la clave de partición / clave principal yid
es la clave de clasificaciónSi realiza una operación de consulta, se aplica solo al
customer_country
valor. El valor solo debe ser operador igual (=).Por lo tanto, solo se obtienen los elementos iguales a esa clave de partición / valor de clave principal.
Si realiza la operación de escaneo, recupera todos los elementos de esa tabla y filtra los datos después de tomarlos.
Nota: No realice una operación de escaneo que exceda su RCU.
fuente
La consulta es mucho mejor que la exploración, en términos de rendimiento. escanear, como su nombre lo indica, escaneará toda la tabla. Pero debe conocer bien la clave de la tabla, la clave de clasificación, los índices y los índices de clasificación relacionados para saber que puede utilizar la Consulta. si filtra su consulta usando:
use Query! de lo contrario, utilice la exploración, que es más flexible sobre las columnas que puede filtrar.
NO puede consultar si:
una buena explicación: https://medium.com/@amos.shahar/dynamodb-query-vs-scan-sql-syntax-and-join-tables-part-1-371288a7cb8f
fuente
En términos de rendimiento, creo que es una buena práctica diseñar su tabla para que las aplicaciones la usen en
Query
lugar deScan
. Debido a que una operación de escaneo siempre escanea toda la tabla antes de filtrar los valores deseados, lo que significa que se necesita más tiempo y espacio para procesar operaciones de datos como leer, escribir y eliminar. Para obtener más información, consulte el documento oficial.fuente
Es similar a la base de datos relacional.
Consiga
query
que está utilizando una clave principal enwhere
condición. La complejidad del cálculo eslog(n)
que la mayor parte de la estructura de claves es un árbol binario.mientras
scan
consulta, debe escanear toda la tabla y luego aplicar un filtro en cada unorow
para encontrar el resultado correcto. La actuación esO(n)
. Es mucho más lento si tu mesa es grande.En resumen, intente usar
get
si conoce la clave principal. soloscan
para el peor de los casos.Además, piense en el índice secundario global para admitir un tipo diferente de consultas en diferentes claves para obtener el objetivo de rendimiento.
fuente