{"id":4193,"date":"2017-11-16T00:00:26","date_gmt":"2017-11-16T08:00:26","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=4193"},"modified":"2025-06-13T17:23:02","modified_gmt":"2025-06-14T00:23:02","slug":"database-indexing-best-practices","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/database-indexing-best-practices\/","title":{"rendered":"Mejores pr\u00e1cticas de indexaci\u00f3n de bases de datos"},"content":{"rendered":"<p><b>Preludio: \u00bfQu\u00e9 es la indexaci\u00f3n de bases de datos?<\/b><\/p>\n<p><b>Indexaci\u00f3n as\u00edncrona:<\/b><span style=\"font-weight: 400\"> Los \u00cdndices Secundarios Globales en bases de datos - Couchbase, por ejemplo - pueden ser creados, actualizados y borrados sin impactar las lecturas y escrituras en los documentos JSON en los nodos de Datos. Esto significa que las inserciones\/actualizaciones\/eliminaciones espec\u00edficas de los \u00edndices se producen de forma as\u00edncrona y las cargas de trabajo est\u00e1n aisladas del resto del sistema.<\/span><\/p>\n<p><b>Comprender los SLA de las consultas y crear los \u00edndices adecuados: <\/b><span style=\"font-weight: 400\">Los \u00edndices est\u00e1n directamente relacionados con las consultas N1QL que se ejecutan. N1QL y GSI van de la mano. Los \u00edndices est\u00e1n pensados como esteroides para las consultas N1QL, reduciendo los costes de latencia y aumentando el rendimiento. Los \u00edndices tambi\u00e9n exigen su propio almacenamiento, pero el riesgo de perder negocio debido a una experiencia lenta(\/de mala calidad) de las consultas es mayor que su coste asociado. Adem\u00e1s, en la mayor\u00eda de los casos los \u00edndices viven fuera de los confines de una aplicaci\u00f3n, lo que ayuda a gestionar adecuadamente su ciclo de vida.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Veamos algunas de las mejores pr\u00e1cticas en materia de \u00edndices de bases de datos para ofrecer las mejores experiencias a los clientes.<\/span><\/p>\n<p><b>1. Ejecutar Index Service en su propio conjunto de nodos<\/b><\/p>\n<p><span style=\"font-weight: 400\">Aunque todos los servicios (datos, consultas, \u00edndices, b\u00fasquedas, etc.) de Couchbase pueden ejecutarse en todos los nodos, recomendamos que las cargas de trabajo individuales se ejecuten en su propio conjunto de nodos. Esto permite aislar las cargas de trabajo y escalarlas de forma independiente. Adem\u00e1s, el hardware puede repartirse adecuadamente en funci\u00f3n de la naturaleza de la carga de trabajo. Por ejemplo, los \u00edndices suelen consumir mucha memoria y las consultas mucha CPU. Se puede disponer de hardware diferente para estos distintos servicios. La escalabilidad independiente para obtener la mejor capacidad de c\u00e1lculo por servicio se consigue gracias a la ventaja arquitect\u00f3nica que nos ofrece el escalado multidimensional (MDS).<\/span><\/p>\n<div id=\"attachment_4196\" style=\"width: 666px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-4196\" class=\"wp-image-4196\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/11\/homogenous-300x69.png\" alt=\"\" width=\"656\" height=\"151\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/homogenous-300x69.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/homogenous-1024x237.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/homogenous-768x178.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/homogenous-1536x356.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/homogenous-20x5.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/homogenous-1320x306.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/homogenous.png 1580w\" sizes=\"auto, (max-width: 656px) 100vw, 656px\" \/><p id=\"caption-attachment-4196\" class=\"wp-caption-text\">Cuando todos los servicios se ejecutan en todos los nodos disponibles<\/p><\/div>\n<div id=\"attachment_4197\" style=\"width: 663px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-4197\" class=\"wp-image-4197\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/11\/mds-300x103.png\" alt=\"\" width=\"653\" height=\"224\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/mds-300x103.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/mds-1024x350.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/mds-768x263.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/mds-1536x525.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/mds-20x7.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/mds-1320x451.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/mds.png 1796w\" sizes=\"auto, (max-width: 653px) 100vw, 653px\" \/><p id=\"caption-attachment-4197\" class=\"wp-caption-text\">Cuando los Servicios individuales se ejecutan en sus propios nodos dedicados<\/p><\/div>\n<p><b>2. 2. Entender el MOI frente al GSI est\u00e1ndar:\u00a0<\/b><\/p>\n<p><span style=\"font-weight: 400\">Couchbase 5.0 introdujo Plasma como un <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/plasma-storage-engine-gsi\/\"><span style=\"font-weight: 400\">nuevo motor de almacenamiento para GSI<\/span><\/a><span style=\"font-weight: 400\">. Plasma es el motor de almacenamiento subrayado cuando se elige \"Secundario global est\u00e1ndar\" en el momento de la configuraci\u00f3n.  Ambos tipos de almacenamiento tienen caracter\u00edsticas diferentes. Cuando el caso de uso exige que todo el \u00edndice sea residente en memoria (SLA m\u00e1s estrictos, latencias m\u00e1s bajas y mayor rendimiento), elija MOI. El GSI est\u00e1ndar (Plasma) es extremadamente \u00fatil cuando todo el \u00edndice no puede ser residente en memoria, lo que denominamos escenario de Datos-Grandes-De-Memoria (DGM); tambi\u00e9n es \u00fatil cuando los costes de memoria son un factor a la hora de decidir el tipo de \u00edndice. Mientras que MOI puede entrar en un modo de pausa cuando la memoria est\u00e1 completamente agotada (es decir, las actualizaciones de \u00edndices se detienen, aunque las consultas ser\u00e1n atendidas), Plasma se desborda adecuadamente al disco y opera (y los \u00edndices en las bases de datos se actualizan) con facilidad. En Couchbase 5.0, Plasma funciona bien hasta escenarios 20% DGM (es decir, 20% de los datos de \u00edndice est\u00e1n en memoria); si la consulta accede a claves tanto en memoria como en disco, entonces hay un impacto adecuado en el rendimiento de la consulta debido al obvio acceso al disco mientras se consulta.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Debido a la naturaleza de ser completamente residente en memoria, MOI es generalmente mucho m\u00e1s r\u00e1pido que Standard GSI (especialmente, el anterior ForestDB). Por el momento, no es posible que ambos tipos de indexaci\u00f3n de la base de datos residan en el mismo cl\u00faster.<\/span><\/p>\n<p><span style=\"font-weight: 400\">El siguiente esquema explica los diferentes motores de almacenamiento de \u00edndices disponibles y sus caracter\u00edsticas de alto nivel<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4199 aligncenter\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/11\/gsi_storage_engine-300x114.png\" alt=\"\" width=\"758\" height=\"288\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/gsi_storage_engine-300x114.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/gsi_storage_engine-1024x390.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/gsi_storage_engine-768x293.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/gsi_storage_engine-1536x585.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/gsi_storage_engine-20x8.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/gsi_storage_engine-1320x503.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/gsi_storage_engine.png 2000w\" sizes=\"auto, (max-width: 758px) 100vw, 758px\" \/><b>3. Utilizar r\u00e9plicas de \u00edndices : <span style=\"font-weight: 400\">Las r\u00e9plicas en GSI son r\u00e9plicas activas, es decir, sirven al doble prop\u00f3sito de equilibrar la carga de consultas N1QL y tambi\u00e9n de asumir el tr\u00e1fico si falla la otra r\u00e9plica de \u00edndice.<\/span><\/b><\/p>\n<pre class=\"\">create index idx on bucket(field1) with {\u201cnum_replica\u201d: 2}<\/pre>\n<p><span style=\"font-weight: 400\"> \u00a0(o)<\/span><\/p>\n<pre class=\"\">create index idx on bucket(field1) with {\u201cnodes\u201d:[\u201c1.2.3.1:8091\u201d, \u201c1.2.3.2:8091\u201d, \u201c1.2.3.3:8091\u201d]}<\/pre>\n<p><span style=\"font-weight: 400\">Ambas copias del \u00edndice se actualizan autom\u00e1ticamente de forma as\u00edncrona a medida que se producen las actualizaciones de los documentos en los nodos de datos. Tener siempre al menos una r\u00e9plica, lo que a su vez significa que hay dos nodos de \u00edndice como m\u00ednimo para dar servicio a las consultas N1QL. Debido al soporte de swap rebalance en 5.0, si un nodo \u00edndice cae, y un nuevo nodo es a\u00f1adido de nuevo, entonces la topolog\u00eda se mantiene. Esto es extremadamente \u00fatil para las operaciones de ampliaci\u00f3n\/reducci\u00f3n debido a estacionalidades en las consultas, cuando se desea moverse entre nodos m\u00e1s grandes y nodos m\u00e1s peque\u00f1os.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Si ya utiliza \u00edndices equivalentes, pase a las r\u00e9plicas. M\u00e1s informaci\u00f3n sobre este proceso <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/transition-index-replicas\/\"><span style=\"font-weight: 400\">aqu\u00ed<\/span><\/a><span style=\"font-weight: 400\">.<\/span><\/p>\n<p><b>4. \u00cdndices Variantes<\/b><\/p>\n<p>GSI tiene diferentes variantes basadas en diferentes casos de uso. Estas variantes se crearon espec\u00edficamente para la naturaleza de las consultas y, por tanto, es muy importante comprender el comportamiento de las consultas y aprovechar adecuadamente estas variantes del \u00edndice.<\/p>\n<table>\n<tbody>\n<tr>\n<td><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.0\/n1ql\/n1ql-language-reference\/createprimaryindex.html\"><span style=\"font-weight: 400\">\u00cdndice primario<\/span><\/a><\/td>\n<td><span style=\"font-weight: 400\">\u00cdndice funcional<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">\u00cdndice primario con nombre<\/span><\/td>\n<td><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.0\/n1ql\/n1ql-language-reference\/indexing-arrays.html\"><span style=\"font-weight: 400\">\u00cdndice de matrices<\/span><\/a><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">\u00cdndice compuesto<\/span><\/td>\n<td><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.0\/indexes\/covering-indexes.html\"><span style=\"font-weight: 400\">\u00cdndice cubierto<\/span><\/a><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">\u00cdndice parcial<\/span><\/td>\n<td><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.0\/n1ql\/n1ql-language-reference\/adaptive-indexing.html\"><span style=\"font-weight: 400\">\u00cdndice adaptativo<\/span><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-weight: 400\">Consulte <\/span><a href=\"https:\/\/dzone.com\/articles\/index-first-and-query-faster\"><span style=\"font-weight: 400\">este art\u00edculo de DZone<\/span><\/a><span style=\"font-weight: 400\"> y <\/span><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.0\/performance\/indexing-and-query-perf.html\"><span style=\"font-weight: 400\">esta documentaci\u00f3n<\/span><\/a><span style=\"font-weight: 400\"> para m\u00e1s informaci\u00f3n.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Para un ejemplo de \u00edndice de base de datos, veamos el \u00cdndice Cubierto: esta variante contiene predicados y todos los atributos indexados en la definici\u00f3n, por lo que se evitan saltos adicionales a los nodos de datos. Las latencias de consulta se reducen considerablemente.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Por ejemplo, si tenemos lo siguiente<\/span><\/p>\n<pre class=\"\">CREATE INDEX `idx_ts_type_iata` ON `travel-sample`(`type`,`iata`);<\/pre>\n<p><span style=\"font-weight: 400\">Y utiliza la consulta:<\/span><\/p>\n<pre class=\"\">select iata from `travel-sample` where type=\"airline\" and iata = \"TQ\"<\/pre>\n<p><span style=\"font-weight: 400\">A continuaci\u00f3n, el Plan Explicativo revelar\u00e1 que la consulta est\u00e1 siendo \"cubierta\" por el \u00edndice:<\/span><\/p>\n<pre class=\"\">\"~children\": [ \u00a0\u00a0\u00a0\u00a0\u00a0\r\n  { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n    \"#operator\": \"IndexScan2\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n      \"covers\": [ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n      \"cover ((`travel-sample`.`type`))\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n      \"cover ((`travel-sample`.`iata`))\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n      \"cover ((meta(`travel-sample`).`id`))\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n  ], \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n  \"index\": \"idx_ts_type_iata\",<\/pre>\n<p><span style=\"font-weight: 400\">Y si intentamos seleccionar 'todos'(usando 'select *') los atributos:<\/span><\/p>\n<pre><span style=\"font-weight: 400\">select * from `viajes-muestra` where type=\"aerol\u00ednea\" and iata = \"TQ\";<\/span><\/pre>\n<p><span style=\"font-weight: 400\">A continuaci\u00f3n, el PLAN DE EXPLICACI\u00d3N revela que la consulta no est\u00e1 cubierta (falta el campo \"covers\"), ya que el servicio de consultas tiene que saltar al servicio de datos para obtener todos los atributos:<\/span><\/p>\n<pre class=\"\">\"~children\": [ \u00a0\u00a0\u00a0\u00a0\u00a0\r\n  { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n    \"#operator\": \"IndexScan2\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n    \"index\": \"idx_ts_type_iata\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n    \"index_id\": \"240cf64d8c6ddce3\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n    \"index_projection\": {\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"primary_key\": true \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n     },<\/pre>\n<p>Del mismo modo, los \u00edndices de matrices se crearon principalmente para ayudar a nuestros clientes a consultar datos JSON, en los que las matrices son muy comunes. Pronto publicaremos un post detallado al respecto.<\/p>\n<p><strong>5.\u00a0<\/strong><b>Evitar claves primarias en producci\u00f3n<\/b><\/p>\n<p><span style=\"font-weight: 400\">Los escaneos primarios completos inesperados son posibles y cualquier posibilidad de tales ocurrencias debe ser eliminada evitando los \u00edndices primarios por completo en Producci\u00f3n. La Selecci\u00f3n de \u00cdndices N1QL es por ahora un sistema basado en reglas que busca un posible \u00edndice que satisfaga la consulta, y si no lo hay, entonces recurre a usar el \u00cdndice Primario. El \u00edndice primario tiene todas las claves de los documentos - por lo tanto, la consulta obtendr\u00e1 todas las claves del \u00edndice primario y luego saltar\u00e1 al Servicio de Datos para obtener los documentos y luego aplicar filtros. Como puede ver, se trata de una operaci\u00f3n muy costosa y debe evitarse a toda costa.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Si no se han creado \u00edndices primarios y la consulta no puede encontrar un \u00edndice que coincida con la consulta, el servicio de consultas mostrar\u00e1 el siguiente mensaje de error, que deber\u00eda ayudarle a crear el \u00edndice secundario necesario:<\/span><\/p>\n<p><span style=\"font-weight: 400\">\"<\/span><i><span style=\"font-weight: 400\">No hay ning\u00fan \u00edndice disponible en el espacio clave travel-sample que coincida con su consulta. Utilice CREATE INDEX o CREATE PRIMARY INDEX para crear un \u00edndice, o compruebe que el \u00edndice que espera est\u00e1 en l\u00ednea.<\/span><\/i><span style=\"font-weight: 400\">.\"<\/span><\/p>\n<p><span style=\"font-weight: 400\">Tambi\u00e9n, como una mejor pr\u00e1ctica inherente de indexaci\u00f3n, la partici\u00f3n de \u00edndices primarios no es soportada por Couchbase. A diferencia de muchos RDBMS, las claves primarias son opcionales en Couchbase.<\/span><\/p>\n<p><b>6. Utilizar planes EXPLAIN<\/b><\/p>\n<p>Para validar si la consulta N1QL est\u00e1 utilizando realmente los \u00edndices creados, compruebe el campo <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/n1ql\/n1ql-language-reference\/explain.html\">EXPLICAR EL PLAN <\/a>resultados. En la consola de administraci\u00f3n de Couchbase, esto se puede obtener f\u00e1cilmente pegando la consulta en el editor de c\u00f3digo y haciendo clic en el bot\u00f3n \"Explicar\". Busque el icono \"<b>1TP5Operador<\/b>\" y \"<b>\u00edndice<\/b>\" del resultado para confirmar el uso del \u00edndice. Enlace a la documentaci\u00f3n.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4211 size-medium_large\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/11\/explain_plan-768x562.png\" alt=\"\" width=\"768\" height=\"562\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/explain_plan-768x562.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/explain_plan-300x220.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/explain_plan-1024x750.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/explain_plan-1536x1125.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/explain_plan-20x15.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/explain_plan-1320x966.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/explain_plan.png 1598w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><b>7. \u00cdndice por predicado<\/b><\/p>\n<p>La cl\u00e1usula WHERE de una consulta se denomina Predicado y los campos\/atributos seleccionados en la cl\u00e1usula SELECT se denominan Proyecci\u00f3n. Los \u00edndices deben crearse siempre teniendo en cuenta la cl\u00e1usula Predicate. Esto se debe a que la Selecci\u00f3n de \u00cdndices se realiza bas\u00e1ndose en la clave principal del \u00edndice presente en el Predicado.<\/p>\n<p><span style=\"font-weight: 400\">Por ejemplo, si tenemos el siguiente \u00edndice sobre 4 atributos:<\/span><\/p>\n<pre class=\"\">CREATE INDEX `idx_ts_type_iata_name_icao` ON `travel-sample`(`type`,`iata`, `name`,`icao`);<\/pre>\n<p><span style=\"font-weight: 400\">Y dispara la siguiente consulta que en realidad omite el atributo icao mientras consulta, el motor de consulta es lo suficientemente inteligente como para saber que debe utilizar el \u00edndice anterior para obtener el mejor rendimiento de la consulta.<\/span><\/p>\n<pre class=\"\">select name from `travel-sample` where icao=\"MLA\" and type=\"airline\";<\/pre>\n<p><span style=\"font-weight: 400\">El \u00edndice seleccionado puede verse en el plan de explicaci\u00f3n siguiente. N\u00f3tese que la consulta se convierte en una consulta de Cobertura, ya que 'name' a pesar de no estar en Predicate s\u00ed est\u00e1 en Projection, por lo que se evita el salto a Data Service.<\/span><\/p>\n<pre class=\"\">\"~children\": [ \u00a0\u00a0\u00a0\u00a0\u00a0\r\n   { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n      \"#operator\": \"IndexScan2\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n      \"covers\": [ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n        \"cover ((`travel-sample`.`type`))\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n        \"cover ((`travel-sample`.`iata`))\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n        \"cover ((`travel-sample`.`name`))\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n        \"cover ((`travel-sample`.`icao`))\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n        \"cover ((meta(`travel-sample`).`id`))\" \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n      ], \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n      \"index\": \"idx_ts_type_iata_name_icao\",<\/pre>\n<p><b>8. Utilizar una clave principal para forzar la selecci\u00f3n del \u00edndice<\/b><\/p>\n<p>Un \u00edndice no se selecciona autom\u00e1ticamente para una consulta si el predicado utilizado en la consulta no coincide con la clave principal del \u00edndice. Si observa que el PLAN EXPLAIN no obliga a seleccionar ning\u00fan \u00edndice, utilice las cl\u00e1usulas \"IS NOT MISSING\" o \"IS NOT NULL\" para forzar la selecci\u00f3n del \u00edndice.<\/p>\n<p><span style=\"font-weight: 400\">Fo<\/span><span style=\"font-weight: 400\">r ejemplo, cualquiera de las siguientes consultas:<\/span><\/p>\n<pre class=\"\">select count(1) from `viaje-muestra` where type IS NOT NULL;\r\nselect count(1) from `viajes-muestra` where type IS NOT MISSING;<\/pre>\n<p><span style=\"font-weight: 400\">utilizar\u00e1 el siguiente \u00edndice, ya que la clave principal del \u00edndice es \"tipo\":<\/span><\/p>\n<pre class=\"\">CREATE INDEX `idx_ts_type_iata` ON `travel-sample`(`type`,`iata`);<\/pre>\n<p><span style=\"font-weight: 400\">Para elegir s\u00f3lo un \u00cdNDICE ya creado, utilice la opci\u00f3n <\/span><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/n1ql\/n1ql-language-reference\/hints.html\"><span style=\"font-weight: 400\">UTILIZAR \u00cdNDICE<\/span><\/a><span style=\"font-weight: 400\"> como parte de la consulta N1QL. Esto es \u00fatil en los casos en los que se sabe que el \u00edndice mencionado en USE INDEX tiene mejor selectividad que el elegido por N1QL Rule Based Optimizer:<\/span><\/p>\n<pre class=\"\">select count(1) from `travel-sample` USE INDEX (idx_ts_type_iata) where type=\"airline\";<\/pre>\n<p><b>9. Utilizar \u00edndices parciales<\/b><\/p>\n<p><span style=\"font-weight: 400\">A veces, el predicado a indexar puede no caber en un nodo debido a limitaciones de tama\u00f1o.  Los GSI en Couchbase no se particionan autom\u00e1ticamente por ahora. Esto obliga al administrador a crear \u00cdndices Parciales; las consultas N1QL son lo suficientemente inteligentes como para elegir el \u00edndice apropiado bas\u00e1ndose en el tipo de predicado usado en la consulta cuando los \u00edndices parciales est\u00e1n presentes. <\/span><\/p>\n<p><span style=\"font-weight: 400\">Por ejemplo, creamos los dos \u00edndices siguientes bas\u00e1ndonos en que el nombre est\u00e1 en dos rangos diferentes:<\/span><\/p>\n<pre class=\"\">CREATE INDEX `idx_ts_name_ak` ON `travel-sample`(`name`) WHERE name BETWEEN \"A\" AND \"K\"; \r\nCREATE INDEX `idx_ts_name_kz` ON `travel-sample`(`name`) WHERE name BETWEEN \"K\" AND \"Z\";<\/pre>\n<p><span style=\"font-weight: 400\">Ahora, las siguientes consultas elegir\u00e1n autom\u00e1ticamente el \u00edndice adecuado, tal y como se pone de manifiesto en los respectivos PLANES EXPLAIN:<\/span><\/p>\n<pre class=\"\">select * from `travel-sample` where name=\"Astraeus\"; \r\n\r\nEXPLAIN PLAN : \r\n\"~children\": [ \u00a0\u00a0\u00a0\u00a0\u00a0\r\n   { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n     \"#operator\": \"IndexScan2\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n     \"index\": \"idx_ts_name_ak\",<\/pre>\n<pre class=\"\">select * from `travel-sample` where name=\"Texas Wings\"; \r\n\r\nEXPLAIN PLAN : \r\n\"~children\": [ \u00a0\u00a0\u00a0\u00a0\u00a0\r\n  { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n     \"#operator\": \"IndexScan2\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n     \"index\": \"idx_ts_name_kz\",<\/pre>\n<p><span style=\"font-weight: 400\">Los \u00edndices se eligen adecuadamente cuando se utiliza la cl\u00e1usula LIKE en el predicado. <\/span><span style=\"font-weight: 400\">Por ejemplo, supongamos que queremos obtener todos los nombres que suenen como un nombre franc\u00e9s (que empiece por \"L'\"):<\/span><\/p>\n<pre class=\"\">select * from `travel-sample` where name like \"L'%\";\r\nEXPLAIN PLAN : \r\n\"~children\": [ \u00a0\u00a0\u00a0\u00a0\u00a0\r\n  { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n     \"#operator\": \"IndexScan2\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n     \"index\": \"idx_ts_name_kz\",<\/pre>\n<p><b>10. Opciones de coherencia<\/b><\/p>\n<p><span style=\"font-weight: 400\">Debido a su naturaleza as\u00edncrona, los GSI en Couchbase son finalmente consistentes por defecto y, como ya se ha mencionado, se actualizan de forma as\u00edncrona. Aunque, usando change feeds(DCP), actualizamos los \u00edndices lo m\u00e1s r\u00e1pidamente posible, es muy posible que ciertas mutaciones de documentos no hayan sido actualizadas en los \u00edndices. Si la sem\u00e1ntica de la consulta exige una consistencia de datos m\u00e1s estricta, Couchbase ofrece modelos de consistencia ajustables en el momento de la consulta.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Las tres opciones de consistencia disponibles en Couchbase son:<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">scan_consistency=not_bounded<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">scan_consistency=at_plus<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">scan_consistency=petici\u00f3n_plus<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400\">Para saber m\u00e1s: <\/span><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/architecture\/querying-data-with-n1ql.html\"><span style=\"font-weight: 400\">Enlace a la documentaci\u00f3n<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400\">Aunque la sem\u00e1ntica request_plus refuerza la integridad de los datos, tiene un impacto en el rendimiento, ya que aumenta la latencia de la consulta, que espera a que el \u00edndice relevante se ponga al d\u00eda con las \u00faltimas mutaciones antes de devolver los datos. not_bounded\" (la opci\u00f3n de coherencia por defecto) es la m\u00e1s r\u00e1pida de las tres opciones de coherencia.<\/span><\/p>\n<p><b>11. Monitor Index Catchup<\/b><\/p>\n<p>Por lo general, el servicio de \u00edndice se pone al d\u00eda con las mutaciones de documentos muy r\u00e1pidamente, de modo que el impacto para el usuario es m\u00ednimo o nulo. Pero como administrador, si quieres asegurarte de que las mutaciones de documentos (que deben actualizarse en el \u00edndice) son las m\u00ednimas posibles y no siguen aumentando, entonces f\u00edjate en la m\u00e9trica \"elementos restantes\" bajo el nombre del \u00edndice.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4212 size-medium_large\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/11\/items_remaining-768x349.png\" alt=\"\" width=\"768\" height=\"349\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/items_remaining-768x349.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/items_remaining-300x136.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/items_remaining-1024x465.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/items_remaining-20x9.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/items_remaining-1320x599.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/items_remaining.png 1432w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/p>\n<p><b>12. Utilizar construcciones diferidas<\/b><\/p>\n<p><span style=\"font-weight: 400\">Las construcciones diferidas ofrecen un proceso de 2 etapas para crear \u00edndices. Se recomienda hacer siempre un uso \u00f3ptimo de las construcciones diferidas, ya que se utiliza la misma fuente de cambios para crear \u00edndices en un nodo. Si no se utilizan las construcciones DEFER, se debe acceder varias veces a la fuente de cambios de los nodos de datos, lo que conlleva una mayor transferencia de datos a trav\u00e9s de la red y un ligero aumento de la carga en los nodos de datos.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Por ejemplo:<\/span><\/p>\n<pre class=\"\">CREATE INDEX `idx_ts_type_iata` ON `travel-sample`(`type`,`iata`) WITH { \"defer_build\":true }; \r\nBUILD INDEX ON `travel-sample`(`idx_ts_type_iata`);<\/pre>\n<p><span style=\"font-weight: 400\">Para obtener m\u00e1s informaci\u00f3n sobre la sintaxis de CREATE INDEX, consulte la secci\u00f3n <\/span><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.0\/n1ql\/n1ql-language-reference\/createindex.html\"><span style=\"font-weight: 400\">Documentaci\u00f3n<\/span><\/a><span style=\"font-weight: 400\">.<\/span><\/p>\n<p><b>13. Evitar claves grandes para indexar<\/b><\/p>\n<p>Antes de la versi\u00f3n 5.0, exist\u00eda una limitaci\u00f3n en el tama\u00f1o de las claves de los \u00edndices (m\u00e1ximo 4k). Esta limitaci\u00f3n se ha eliminado en la versi\u00f3n 5.0. Tenga en cuenta que los \u00edndices est\u00e1n pensados para las rutas de acceso a los datos, por lo que el modelo de datos y la consulta (con \u00edndices) deben estructurarse para obtener la informaci\u00f3n necesaria en el menor tiempo posible. Aunque los clientes pueden tener cualquier n\u00famero de campos en un \u00edndice compuesto, el tama\u00f1o de la clave del \u00edndice tambi\u00e9n crece proporcionalmente.  Los tama\u00f1os de clave realmente grandes pueden afectar al rendimiento. Como regla general, es preferible que el tama\u00f1o combinado de todos los campos de un \u00edndice compuesto sea de 1kB; y si no es posible, refactorice las consultas convenientemente.<\/p>\n<p><b>14. UTILIZAR CLAVES, evitar \u00edndices<\/b><\/p>\n<p>No es necesario que todas las consultas N1QL requieran \u00edndices. Si tus consultas N1QL pueden funcionar independientemente de los \u00edndices, consultando directamente los documentos usando claves, entonces la directiva USE KEYS es \u00fatil.<\/p>\n<p><span style=\"font-weight: 400\">Por ejemplo:<\/span><\/p>\n<pre class=\"\">SELECT * FROM `travel-sample` USE KEYS [\"landmark_37588\"];<\/pre>\n<p><span style=\"font-weight: 400\">El plan de explicaci\u00f3n resultante mostrar\u00e1 que se est\u00e1 realizando un KeyScan (sin ninguna menci\u00f3n a un IndexScan):<\/span><\/p>\n<pre class=\"\">\"~children\": [\r\n \u00a0\u00a0\u00a0\u00a0\u00a0{\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"#operator\": \"KeyScan\", \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n        \"keys\": \"[\\\"landmark_37588\\\"]\" \u00a0\u00a0\u00a0\u00a0\u00a0\r\n      }<\/pre>\n<p><span style=\"font-weight: 400\">Esto es m\u00e1s una cosa que hay que saber que una pr\u00e1ctica recomendada, ya que USE KEYS no utiliza \u00edndices para devolver resultados del servicio de consulta. Aunque es muy poco probable que los clientes s\u00f3lo puedan tener consultas que siempre utilicen USE KEYS, esto puede ser \u00fatil en los casos extremos que obliguen a tal comportamiento.<\/span><\/p>\n<p>\u00a1Post largo! Pero, espero que esto haya sido \u00fatil para entender las bases de datos y los \u00edndices y c\u00f3mo la indexaci\u00f3n en las mejores pr\u00e1cticas de DBMS puede ayudarle a ofrecer experiencias superiores al cliente :)<\/p>\n<p>PS: Visi\u00f3n general de GSI y novedades de Couchbase Server 5.0 : https:\/\/www.youtube.com\/watch?v=OrC2gkm2OFA<\/p>","protected":false},"excerpt":{"rendered":"<p>Prelude: What is Database Indexing? Asynchronous Indexing: Global Secondary Indexes in databases &#8212; Couchbase, for example &#8212; can be created, updated and deleted without impacting the reads and writes on the JSON documents in Data nodes. This means that index-specific [&hellip;]<\/p>","protected":false},"author":3013,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,1812],"tags":[1695,1505,1626,1641],"ppma_author":[9055],"class_list":["post-4193","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-n1ql-query","tag-gsi","tag-index","tag-index-managment","tag-secondary-indexing"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Database Indexing Best Practices &amp; Types of Examples<\/title>\n<meta name=\"description\" content=\"What is database indexing? Couchbase is here to with examples of database index best practices for delivering a high-quality customer experience.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/database-indexing-best-practices\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Database Indexing Best Practices\" \/>\n<meta property=\"og:description\" content=\"What is database indexing? Couchbase is here to with examples of database index best practices for delivering a high-quality customer experience.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/database-indexing-best-practices\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-11-16T08:00:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T00:23:02+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/homogenous.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1580\" \/>\n\t<meta property=\"og:image:height\" content=\"366\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Venkat Subramanian, Product Manager\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@venkasub\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Venkat Subramanian, Product Manager\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/\"},\"author\":{\"name\":\"Venkat Subramanian, Product Manager\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/0756e2347c2166a32f93f9a7e07e9f90\"},\"headline\":\"Database Indexing Best Practices\",\"datePublished\":\"2017-11-16T08:00:26+00:00\",\"dateModified\":\"2025-06-14T00:23:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/\"},\"wordCount\":2099,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"GSI\",\"Index\",\"index managment\",\"Secondary Indexing\"],\"articleSection\":[\"Couchbase Server\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/\",\"name\":\"Database Indexing Best Practices & Types of Examples\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-11-16T08:00:26+00:00\",\"dateModified\":\"2025-06-14T00:23:02+00:00\",\"description\":\"What is database indexing? Couchbase is here to with examples of database index best practices for delivering a high-quality customer experience.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Database Indexing Best Practices\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/0756e2347c2166a32f93f9a7e07e9f90\",\"name\":\"Venkat Subramanian, Product Manager\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8f9acdf95e167a15007b71867fe87a9a\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/53cfc83eb606325239f7058417a02969ab8ff0106a374bcdcf5d78f9b749cccd?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/53cfc83eb606325239f7058417a02969ab8ff0106a374bcdcf5d78f9b749cccd?s=96&d=mm&r=g\",\"caption\":\"Venkat Subramanian, Product Manager\"},\"description\":\"Venkat dabbles in product development and product management and has been developing data\/analytics platforms &amp; products. Significant chunk of his experience has been with Oracle, where he transitioned from being an Engineer in Oracle\u2019s Enterprise Manager team to Product Manager for Oracle's BI\/Analytics suite of products. He has worked in startups in the past helping develop machine-learning\/NLP products and distributed decisioning systems. He lurks around at @venkasub.\",\"sameAs\":[\"https:\/\/x.com\/venkasub\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/venkatcouchbase-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Database Indexing Best Practices & Types of Examples","description":"What is database indexing? Couchbase is here to with examples of database index best practices for delivering a high-quality customer experience.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/database-indexing-best-practices\/","og_locale":"es_MX","og_type":"article","og_title":"Database Indexing Best Practices","og_description":"What is database indexing? Couchbase is here to with examples of database index best practices for delivering a high-quality customer experience.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/database-indexing-best-practices\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-11-16T08:00:26+00:00","article_modified_time":"2025-06-14T00:23:02+00:00","og_image":[{"width":1580,"height":366,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/homogenous.png","type":"image\/png"}],"author":"Venkat Subramanian, Product Manager","twitter_card":"summary_large_image","twitter_creator":"@venkasub","twitter_misc":{"Written by":"Venkat Subramanian, Product Manager","Est. reading time":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/"},"author":{"name":"Venkat Subramanian, Product Manager","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/0756e2347c2166a32f93f9a7e07e9f90"},"headline":"Database Indexing Best Practices","datePublished":"2017-11-16T08:00:26+00:00","dateModified":"2025-06-14T00:23:02+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/"},"wordCount":2099,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["GSI","Index","index managment","Secondary Indexing"],"articleSection":["Couchbase Server","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/","url":"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/","name":"Database Indexing Best Practices & Types of Examples","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-11-16T08:00:26+00:00","dateModified":"2025-06-14T00:23:02+00:00","description":"What is database indexing? Couchbase is here to with examples of database index best practices for delivering a high-quality customer experience.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Database Indexing Best Practices"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/0756e2347c2166a32f93f9a7e07e9f90","name":"Venkat Subramanian, Director de Producto","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8f9acdf95e167a15007b71867fe87a9a","url":"https:\/\/secure.gravatar.com\/avatar\/53cfc83eb606325239f7058417a02969ab8ff0106a374bcdcf5d78f9b749cccd?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/53cfc83eb606325239f7058417a02969ab8ff0106a374bcdcf5d78f9b749cccd?s=96&d=mm&r=g","caption":"Venkat Subramanian, Product Manager"},"description":"Venkat se dedica al desarrollo y la gesti\u00f3n de productos y ha desarrollado plataformas y productos de datos y an\u00e1lisis. Una parte importante de su experiencia ha sido con Oracle, donde pas\u00f3 de ser ingeniero en el equipo Enterprise Manager de Oracle a director de producto para el conjunto de productos de BI\/Anal\u00edtica de Oracle. Ha trabajado en startups en el pasado ayudando a desarrollar productos de aprendizaje autom\u00e1tico\/NLP y sistemas de toma de decisiones distribuidos. Est\u00e1 al acecho en @venkasub.","sameAs":["https:\/\/x.com\/venkasub"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/venkatcouchbase-com\/"}]}},"authors":[{"term_id":9055,"user_id":3013,"is_guest":0,"slug":"venkatcouchbase-com","display_name":"Venkat Subramanian, Product Manager","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/53cfc83eb606325239f7058417a02969ab8ff0106a374bcdcf5d78f9b749cccd?s=96&d=mm&r=g","author_category":"","last_name":"Subramanian, Product Manager","first_name":"Venkat","job_title":"","user_url":"","description":"Venkat se dedica al desarrollo y la gesti\u00f3n de productos y ha desarrollado plataformas y productos de datos y an\u00e1lisis. Una parte importante de su experiencia ha sido con Oracle, donde pas\u00f3 de ser ingeniero en el equipo Enterprise Manager de Oracle a director de producto para el conjunto de productos de BI\/Anal\u00edtica de Oracle. Ha trabajado en startups en el pasado ayudando a desarrollar productos de aprendizaje autom\u00e1tico\/NLP y sistemas de toma de decisiones distribuidos. Est\u00e1 al acecho en @venkasub."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4193","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/3013"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=4193"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4193\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=4193"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=4193"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=4193"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=4193"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}