Un par de preguntas frecuentes sobre N1QL para el servicio de consultas:

  1. ¿Cuándo se utiliza realmente un índice primario?
  2. ¿Por qué la index advisor no recomienda el índice primario cuando esa puede ser la única opción?

Sigue leyendo...

Couchbase es una base de datos distribuida. Soporta un modelo de datos flexible usando JSON. Cada documento en un bucket tendrá una clave de documento única generada por el usuario. Esta unicidad se aplica durante la inserción o actualización de los datos. He aquí un documento de ejemplo.

Cada bucket de Couchbase puede almacenar datos de varios tipos: cliente, pedido, catálogo, etc. Al cargar el conjunto de datos "travel-sample", se cargan cinco tipos distintos de documentos: aerolínea, aeropuerto, hotel, ruta, puntos de referencia.

Pero, por defecto, Couchbase no tiene el equivalente de "escaneo de tabla completa" para escanear todos los documentos de principio a fin. El escaneo del índice primario te proporciona el equivalente al "escaneo de tabla completa".

CREATE PRIMARY INDEX ix_customer_primary ON customer;

¿Qué es el índice primario?

    • una lista ordenada de todas las claves de documentos de cada tipo de documento dentro del bucket cliente.
    • se mantiene de forma asíncrona, al igual que otros índices secundarios
    • guarda sólo la clave del documento y nada más
    • admite todas las consistencias de escaneado:
      • Sin límites
      • AT_PLUS
      • SOLICITUD_PLUS

El índice primario permite al motor de consulta acceder a todos los documentos y realizar sobre ellos las operaciones de filtrado, unión, agregación, etc.

EXPLAIN SELECT * from cliente WHERE código postal = 94040 nombre = "joe" y tipo = "cx";

Esto es lento. Muy lento. Obtención innecesaria de documentos; filtrado innecesario. Desperdicio de memoria y CPU. Los escaneos primarios recuperarán TODOS los documentos de todos los tipos en el bucket, independientemente de si su consulta finalmente los devuelve al usuario o no. Aunque he dicho que el escaneo primario es como un escaneo de tabla, es mucho más lento que el escaneo de tabla ya que tiene que escanear todos los documentos de todos los tipos.

No debe utilizar índices primarios. No los utilice. Especialmente en producción.

 Entonces, ¿para qué tenemos índices primarios, para empezar?

  1. Cuando esté empezando a jugar con nuevos datos de muestra, puede ejecutar la mayoría de las consultas sin preocuparse de crear índices específicos. En este punto, tu principal preocupación es comprender los datos en lugar de ajustar el rendimiento.
  2. Cuando conozca el rango de claves primarias que desea escanear.
    1. DONDE META().id entre "cx:123" y "cx:458"
  3. Cuando conozca el siguiendo META().id como el siguiente
    1. DONDE META().id COMO "cx:1%"
    2. NO utilice: COMO "%:123". Esto resultará en un escaneo completo
  4. Si conoce el META().id completo o la lista de META().id, puede utilizar USE KEYS para obtener directamente el documento sin consultar el índice primario.
    1. DESDE cliente UTILICE TECLAS ["cx:123"]
    2. DESDE cliente UTILICE TECLAS ["cx:123", "cx:359", "cx:948"]
    3. DESDE cliente UTILICE TECLAS (SELECCIONE en bruto docid DESDE mi lista DONDE zip = 94501)

Índice primario

crear el índice primario sobre 'muestra-viaje';

El índice primario es simplemente el índice de la clave de documento de todo el bucket. La capa de datos de Couchbase impone la restricción de unicidad en la clave del documento. El índice primario, como cualquier otro índice en Couchbase, se mantiene de forma asíncrona. El índice primario se mantiene de forma asíncrona. nivel de coherencia para su consulta.

Estos son los metadatos de este índice:

Los metadatos proporcionan información adicional sobre el índice: Dónde reside el índice (datastore_id), su estado (state) y el método de indexación (using).
El índice primario se utiliza para escaneos de bucket completos (escaneos primarios) cuando la consulta no tiene ningún filtro (predicados) o no se puede utilizar ningún otro índice o ruta de acceso. En Couchbase, almacenas múltiples keyspaces (documentos de diferente tipo, clientes, pedidos, inventario, etc) en un único bucket. Por lo tanto, cuando se hace el escaneo primario, la consulta utilizará el índice para obtener las claves de los documentos y obtener todos los documentos en el cubo y luego aplicar el filtro. Esto es MUY CARO.

El diseño de la clave de documento es algo así como el diseño de la clave primaria con múltiples partes.

Apellido:nombre:ID cliente

Ejemplo: smith:john:X1A1849

En Couchbase, es una buena práctica prefijar la clave con el tipo de documento. Dado que se trata de un documento de cliente, vamos a prefijar con CX. Ahora, la clave se convierte en:

Así que, en el mismo cubo, habrá otros tipos de documentos.

Estas son simplemente las mejores prácticas. No hay ninguna restricción en el formato o la estructura de la clave del documento en Couchbase, excepto que tienen que ser únicos dentro de un cubo.

Ahora, si tienes documentos con varias claves y tienes un índice primario, puedes utilizar las siguientes consultas para hacerlo de forma eficiente.

Ejemplo 1: Búsqueda de una clave de documento específica.

Si conoce la clave completa del documento, puede utilizar la siguiente sentencia y evitar por completo el acceso al índice.

SELECCIONAR * DESDE ventas UTILICE TECLAS ["CX:smith:john:X1A1849"]

Puede obtener más de un documento en una declaración.

Ejemplo 2:  Busque un patrón. Consigue TODOS los documentos del cliente.

Ejemplo 3:  Consigue a todos los clientes que se apelliden Smith.

La siguiente consulta utiliza el índice primario de forma eficiente, obteniendo únicamente los clientes con un rango determinado.  Nota: Este escaneo distingue entre mayúsculas y minúsculas. Para realizar una búsqueda sin distinguir mayúsculas de minúsculas, debe crear un índice secundario con UPPER() o LOWER() de la clave del documento.

Ejemplo 4:  Es habitual que algunas aplicaciones utilicen la dirección de correo electrónico como parte de la clave del documento, ya que son únicas. En ese caso, es necesario averiguar todos los clientes con gmail.com. Si este es un requisito típico, entonces, almacene el REVERSO de la dirección de correo electrónico como la clave y simplemente haga el escaneo del patrón de cadena líder.

Correo electrónico:johnsmith@gmail.com;   clave: invertir("johnsmith@gmail.com") => moc.liamg@htimsnhoj 

Correo electrónico: janesnow@yahoo.com  clave: invertir("janesnow@yahoo.com") => moc.oohay@wonsenaj

Índice primario con nombre

En Couchbase 5.0, puedes crear múltiples réplicas de cualquier índice con un simple parámetro a CREATE INDEX. A continuación se crearán 3 copias del índice y tiene que haber un mínimo de 3 nodos de índice en el clúster.

También puede asignar un nombre al índice primario. El resto de las características del índice primario son las mismas, excepto el nombre del índice. Un buen efecto secundario de esto es que puedes tener múltiples índices primarios en versiones de Couchbase anteriores a la 5.0 usando diferentes nombres. Los índices duplicados ayudan a la alta disponibilidad así como a la distribución de la carga de consultas a través de ellos. Esto es cierto tanto para los índices primarios como para los secundarios.

Finalmente, en Couchbase 6.5, hemos introducido el Index advisor. Puede analizar una única sentencia N1QL o carga de trabajo. Lee los detalles en:

  1. Asesor de Índices N1QL: Mejore el rendimiento y la productividad de las consultas
  2. Asesor de índices para la declaración de consulta N1QL
  3. Asesor de índices para cargas de trabajo de consulta

Este asesor de índices sólo aconseja índices secundarios adecuados y nunca un índice primario. Si has leído el artículo hasta ahora, ¡ya sabes por qué! Descargar Couchbase 6.5 y ¡prueba todas las novedades!

Autor

Publicado por Keshav Murthy

Keshav Murthy es Vicepresidente de Couchbase R&D. Anteriormente, estuvo en MapR, IBM, Informix, Sybase, con más de 20 años de experiencia en diseño y desarrollo de bases de datos. Dirigió el equipo de I+D de SQL y NoSQL en IBM Informix. Ha recibido dos premios President's Club en Couchbase y dos premios Outstanding Technical Achievement en IBM. Keshav es licenciado en Informática e Ingeniería por la Universidad de Mysore (India), es titular de diez patentes estadounidenses y tiene tres pendientes.

2 Comentarios

  1. ¡¡¡Muy buen artículo, te mantuviste en el tema y fue muy fácil de seguir genial !!!

    Un par de preguntas,

    Como la mayoría de SQL ¿por qué no se crea un índice primario por defecto en couchbase en la columna type si existe?

    ¿Crear varios índices "con nombre" del mismo tipo y combinación (Primario / GSI) es una buena práctica teniendo en cuenta la compensación de costes?

  2. amit.kulkarni@sacumen.com abril 22, 2020 a 3:09 am

    Hola Keshav,

    Espero que estéis bien@ en estos tiempos difíciles.
    Gracias por este magnífico artículo.
    Sólo tengo una pregunta, ¿hay alguna otra manera, para recuperar el ID del documento sin utilizar índices y vistas, si no sabemos el ID del documento de antemano. Por favor, hágamelo saber.
    Saludos cordiales,
    Amit.

Dejar una respuesta