{"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\/pt\/database-indexing-best-practices\/","title":{"rendered":"Pr\u00e1ticas recomendadas de indexa\u00e7\u00e3o de banco de dados"},"content":{"rendered":"<p><b>Prel\u00fadio: O que \u00e9 indexa\u00e7\u00e3o de banco de dados?<\/b><\/p>\n<p><b>Indexa\u00e7\u00e3o ass\u00edncrona:<\/b><span style=\"font-weight: 400\"> Os \u00edndices secund\u00e1rios globais em bancos de dados - Couchbase, por exemplo - podem ser criados, atualizados e exclu\u00eddos sem afetar as leituras e grava\u00e7\u00f5es nos documentos JSON nos n\u00f3s de dados. Isso significa que as inser\u00e7\u00f5es\/atualiza\u00e7\u00f5es\/exclus\u00f5es espec\u00edficas do \u00edndice ocorrem de forma ass\u00edncrona e as cargas de trabalho s\u00e3o isoladas do restante do sistema.<\/span><\/p>\n<p><b>Compreender os SLAs de consulta e criar \u00edndices de forma adequada: <\/b><span style=\"font-weight: 400\">Os \u00edndices est\u00e3o diretamente relacionados \u00e0s consultas N1QL que s\u00e3o executadas. N1QL e GSI andam juntos. Os \u00edndices devem ser esteroides para consultas N1QL, reduzindo os custos de lat\u00eancia e aumentando a taxa de transfer\u00eancia. Os \u00edndices tamb\u00e9m exigem seu pr\u00f3prio armazenamento, mas o risco de perder neg\u00f3cios devido \u00e0 lentid\u00e3o (ou m\u00e1 qualidade) da experi\u00eancia de envolvimento do cliente \u00e9 maior do que o custo associado a eles. Al\u00e9m disso, na maioria dos casos, os \u00edndices vivem fora dos limites de um aplicativo, o que ajuda a gerenciar adequadamente seu ciclo de vida.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Vamos dar uma olhada em algumas pr\u00e1ticas recomendadas de \u00edndice de banco de dados para proporcionar as melhores experi\u00eancias aos clientes.<\/span><\/p>\n<p><b>1. Executar o Index Service em seu pr\u00f3prio conjunto de n\u00f3s<\/b><\/p>\n<p><span style=\"font-weight: 400\">Embora todos os servi\u00e7os - dados, consulta, \u00edndice, pesquisa etc. - no Couchbase possam ser executados em todos os n\u00f3s, recomendamos que as cargas de trabalho individuais sejam executadas em seu pr\u00f3prio conjunto de n\u00f3s. Isso permite o isolamento da carga de trabalho e o dimensionamento independente. Al\u00e9m disso, o hardware pode ser distribu\u00eddo adequadamente com base na natureza da carga de trabalho. Por exemplo, os \u00edndices geralmente consomem muita mem\u00f3ria e as consultas consomem muita CPU. Voc\u00ea pode ter diferentes hardwares para esses diferentes servi\u00e7os. A escalabilidade independente para obter a melhor capacidade computacional por servi\u00e7o \u00e9 obtida por meio do recurso arquitet\u00f4nico que o escalonamento multidimensional (MDS) nos oferece.<\/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\">Quando todos os servi\u00e7os s\u00e3o executados em todos os n\u00f3s dispon\u00edveis<\/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\">Quando os servi\u00e7os individuais s\u00e3o executados em seus pr\u00f3prios n\u00f3s dedicados<\/p><\/div>\n<p><b>2. Entenda o MOI versus o GSI padr\u00e3o:\u00a0<\/b><\/p>\n<p><span style=\"font-weight: 400\">O Couchbase 5.0 introduziu o Plasma como um <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/plasma-storage-engine-gsi\/\"><span style=\"font-weight: 400\">Novo mecanismo de armazenamento para GSI<\/span><\/a><span style=\"font-weight: 400\">. O plasma \u00e9 o mecanismo de armazenamento sublinhado quando \"Standard Global Secondary\" \u00e9 escolhido no momento da configura\u00e7\u00e3o.  Os dois tipos de armazenamento t\u00eam caracter\u00edsticas diferentes. Quando o caso de uso exigir que todo o \u00edndice seja residente na mem\u00f3ria (SLAs mais r\u00edgidos, lat\u00eancias mais baixas + taxas de transfer\u00eancia mais altas), escolha o MOI. O GSI padr\u00e3o (Plasma) \u00e9 extremamente \u00fatil quando todo o \u00edndice n\u00e3o pode ser residente na mem\u00f3ria, o que chamamos de cen\u00e1rio Data-Greater-Than-Memory (DGM); tamb\u00e9m \u00e9 \u00fatil quando os custos de mem\u00f3ria s\u00e3o um fator na decis\u00e3o do tipo de \u00edndice. Enquanto o MOI pode entrar em um modo de pausa quando a mem\u00f3ria \u00e9 totalmente utilizada (ou seja, as atualiza\u00e7\u00f5es de \u00edndice s\u00e3o interrompidas, embora as consultas sejam atendidas), o Plasma transborda adequadamente para o disco e opera (e os \u00edndices nos bancos de dados s\u00e3o atualizados) com facilidade. No Couchbase 5.0, o Plasma funciona bem at\u00e9 cen\u00e1rios DGM 20% (ou seja, 20% dos dados do \u00edndice est\u00e3o na mem\u00f3ria); se a consulta acessar chaves na mem\u00f3ria e no disco, haver\u00e1 um impacto adequado no desempenho da consulta devido ao acesso \u00f3bvio ao disco durante a consulta.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Devido \u00e0 natureza de ser totalmente residente na mem\u00f3ria, o MOI \u00e9 geralmente muito mais r\u00e1pido do que o GSI padr\u00e3o (especialmente o antigo ForestDB). At\u00e9 o momento, n\u00e3o \u00e9 poss\u00edvel ter os dois tipos de indexa\u00e7\u00e3o no banco de dados residindo no mesmo cluster.<\/span><\/p>\n<p><span style=\"font-weight: 400\">O esquema a seguir explica os diferentes mecanismos de armazenamento de \u00edndices dispon\u00edveis e seus recursos de alto n\u00edvel<\/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. Usar r\u00e9plicas de \u00edndices : <span style=\"font-weight: 400\">As r\u00e9plicas no GSI s\u00e3o r\u00e9plicas ativas, ou seja, elas servem ao duplo prop\u00f3sito de balancear a carga das consultas N1QL e tamb\u00e9m de receber o tr\u00e1fego se a outra r\u00e9plica de \u00edndice falhar.<\/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(ou)<\/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\">As duas c\u00f3pias do \u00edndice s\u00e3o atualizadas automaticamente de forma ass\u00edncrona, \u00e0 medida que as atualiza\u00e7\u00f5es dos documentos ocorrem nos n\u00f3s de dados. Sempre tenha pelo menos uma r\u00e9plica, o que, por sua vez, significa que deve haver no m\u00ednimo dois n\u00f3s de \u00edndice para atender \u00e0s consultas N1QL. Devido ao suporte do rebalanceamento de swap na vers\u00e3o 5.0, se um n\u00f3 de \u00edndice cair e um novo n\u00f3 for adicionado novamente, a topologia ser\u00e1 mantida. Isso \u00e9 extremamente \u00fatil para opera\u00e7\u00f5es de aumento\/diminui\u00e7\u00e3o de escala devido a sazonalidades nas consultas, quando voc\u00ea deseja alternar entre n\u00f3s maiores e n\u00f3s menores.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Se j\u00e1 estiver usando \u00edndices equivalentes, fa\u00e7a a transi\u00e7\u00e3o para r\u00e9plicas. Leia mais sobre esse processo <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/transition-index-replicas\/\"><span style=\"font-weight: 400\">aqui<\/span><\/a><span style=\"font-weight: 400\">.<\/span><\/p>\n<p><b>4. Variantes de \u00edndices<\/b><\/p>\n<p>O GSI tem diferentes variantes com base em diferentes casos de uso. Essas diferentes variantes foram criadas especificamente para a natureza das consultas e, portanto, \u00e9 extremamente importante entender o comportamento das consultas e aproveitar adequadamente essas variantes de \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 prim\u00e1rio<\/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 prim\u00e1rio nomeado<\/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 da matriz<\/span><\/a><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">\u00cdndice composto<\/span><\/td>\n<td><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.0\/indexes\/covering-indexes.html\"><span style=\"font-weight: 400\">\u00cdndice coberto<\/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\">D\u00ea uma olhada em <\/span><a href=\"https:\/\/dzone.com\/articles\/index-first-and-query-faster\"><span style=\"font-weight: 400\">Este artigo da DZone<\/span><\/a><span style=\"font-weight: 400\"> e <\/span><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.0\/performance\/indexing-and-query-perf.html\"><span style=\"font-weight: 400\">esta documenta\u00e7\u00e3o<\/span><\/a><span style=\"font-weight: 400\"> para saber mais sobre o assunto acima.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Para um exemplo de \u00edndice de banco de dados, vamos dar uma olhada no Covered Index: essa variante cont\u00e9m predicados e todos os atributos que foram indexados na defini\u00e7\u00e3o, o que evita saltos adicionais para os n\u00f3s de dados. As lat\u00eancias de consulta s\u00e3o significativamente reduzidas.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Por exemplo, se tivermos o seguinte:<\/span><\/p>\n<pre class=\"\">CREATE INDEX `idx_ts_type_iata` ON `travel-sample`(`type`,`iata`);<\/pre>\n<p><span style=\"font-weight: 400\">E use a 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\">Em seguida, o Explain Plan revelar\u00e1 que a consulta est\u00e1 sendo \"coberta\" pelo \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\">E se tentarmos selecionar os atributos 'all' (usando 'select *'):<\/span><\/p>\n<pre><span style=\"font-weight: 400\">select * from `travel-sample` where type=\"airline\" and iata = \"TQ\";<\/span><\/pre>\n<p><span style=\"font-weight: 400\">Em seguida, o EXPLAIN PLAN revela que a consulta n\u00e3o est\u00e1 coberta (falta o campo \"covers\"), pois o Query Service precisa ir at\u00e9 o Data Service para buscar todos os 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>Da mesma forma, os \u00edndices de matriz foram criados principalmente para ajudar nossos clientes a consultar dados JSON, nos quais as matrizes s\u00e3o muito comuns. Em breve, publicaremos um post detalhado sobre isso!<\/p>\n<p><strong>5.\u00a0<\/strong><b>Evitar chaves prim\u00e1rias na produ\u00e7\u00e3o<\/b><\/p>\n<p><span style=\"font-weight: 400\">Varreduras prim\u00e1rias completas inesperadas s\u00e3o poss\u00edveis e qualquer possibilidade de tais ocorr\u00eancias deve ser removida evitando-se totalmente os \u00edndices prim\u00e1rios na produ\u00e7\u00e3o. Por enquanto, o N1QL Index Selection \u00e9 um sistema baseado em regras que verifica se h\u00e1 um poss\u00edvel \u00edndice que satisfa\u00e7a a consulta e, se n\u00e3o houver nenhum, ele recorre ao uso do \u00edndice prim\u00e1rio. O \u00edndice prim\u00e1rio tem todas as chaves dos documentos - portanto, a consulta buscar\u00e1 todas as chaves do \u00edndice prim\u00e1rio e, em seguida, saltar\u00e1 para o Data Service para buscar os documentos e aplicar filtros. Como voc\u00ea pode ver, essa \u00e9 uma opera\u00e7\u00e3o muito cara e deve ser evitada a todo custo.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Se n\u00e3o houver \u00edndices prim\u00e1rios criados e a consulta n\u00e3o conseguir encontrar um \u00edndice correspondente para atender \u00e0 consulta, o Query Service apresentar\u00e1 um erro com a seguinte mensagem, que dever\u00e1 ajud\u00e1-lo a criar o \u00edndice secund\u00e1rio necess\u00e1rio:<\/span><\/p>\n<p><span style=\"font-weight: 400\">\"<\/span><i><span style=\"font-weight: 400\">N\u00e3o h\u00e1 \u00edndice dispon\u00edvel no espa\u00e7o-chave travel-sample que corresponda \u00e0 sua consulta. Use CREATE INDEX ou CREATE PRIMARY INDEX para criar um \u00edndice ou verifique se o \u00edndice esperado est\u00e1 on-line<\/span><\/i><span style=\"font-weight: 400\">.\"<\/span><\/p>\n<p><span style=\"font-weight: 400\">Al\u00e9m disso, como uma pr\u00e1tica recomendada de indexa\u00e7\u00e3o inerente, o particionamento de \u00edndices prim\u00e1rios n\u00e3o \u00e9 suportado pelo Couchbase. Diferentemente de muitos RDBMSs, as chaves prim\u00e1rias s\u00e3o opcionais no Couchbase.<\/span><\/p>\n<p><b>6. Usar planos EXPLAIN<\/b><\/p>\n<p>Para validar se a consulta N1QL est\u00e1 de fato usando os \u00edndices criados, verifique o <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/n1ql\/n1ql-language-reference\/explain.html\">EXPLICAR O PLANO <\/a>resultados. No Console de administra\u00e7\u00e3o do Couchbase, isso pode ser facilmente obtido colando a consulta no editor de c\u00f3digo e clicando no bot\u00e3o \"Explain\" (Explicar). Fique atento ao \u00edcone \"<b>#operador<\/b>\" e \"<b>\u00edndice<\/b>\" do resultado para confirmar o uso do \u00edndice. Link da documenta\u00e7\u00e3o.<\/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>A cl\u00e1usula WHERE em uma consulta \u00e9 chamada de Predicado e os campos\/atributos selecionados na cl\u00e1usula SELECT s\u00e3o chamados de Proje\u00e7\u00e3o. Os \u00edndices devem sempre ser criados tendo em mente a cl\u00e1usula Predicate. Isso se deve ao fato de a sele\u00e7\u00e3o do \u00edndice ocorrer com base na chave principal do \u00edndice presente no Predicate.<\/p>\n<p><span style=\"font-weight: 400\">Por exemplo, se tivermos o seguinte \u00edndice em 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\">E disparar a seguinte consulta que realmente ignora o atributo icao durante a consulta, o mecanismo de consulta \u00e9 inteligente o suficiente para saber usar o \u00edndice acima para obter o melhor desempenho da 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\">O \u00edndice selecionado pode ser visto no plano de explica\u00e7\u00e3o abaixo. Observe que a consulta se torna uma consulta de cobertura, pois \"name\", apesar de n\u00e3o estar em Predicate, est\u00e1 em Projection, portanto, o salto para o Data Service \u00e9 evitado.<\/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. Usar uma chave principal para for\u00e7ar a sele\u00e7\u00e3o do \u00edndice<\/b><\/p>\n<p>Um \u00edndice n\u00e3o \u00e9 selecionado automaticamente para uma consulta se o predicado usado na consulta n\u00e3o corresponder \u00e0 chave principal do \u00edndice. Se voc\u00ea perceber que o EXPLAIN PLAN n\u00e3o for\u00e7a a sele\u00e7\u00e3o de nenhum \u00edndice, use a cl\u00e1usula \"IS NOT MISSING\" ou \"IS NOT NULL\" para for\u00e7ar a sele\u00e7\u00e3o do \u00edndice.<\/p>\n<p><span style=\"font-weight: 400\">Fo<\/span><span style=\"font-weight: 400\">Por exemplo, qualquer uma das seguintes consultas:<\/span><\/p>\n<pre class=\"\">select count(1) from `travel-sample` where type IS NOT NULL; \r\nselect count(1) from `travel-sample` where type IS NOT MISSING;<\/pre>\n<p><span style=\"font-weight: 400\">usar\u00e1 o seguinte \u00edndice, pois a chave principal do \u00edndice \u00e9 'type':<\/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 escolher apenas um INDEX j\u00e1 criado, use a op\u00e7\u00e3o <\/span><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/n1ql\/n1ql-language-reference\/hints.html\"><span style=\"font-weight: 400\">\u00cdNDICE DE USO<\/span><\/a><span style=\"font-weight: 400\"> como parte da consulta N1QL. Isso \u00e9 \u00fatil nos casos em que voc\u00ea sabe que o \u00edndice mencionado em USE INDEX tem melhor seletividade do que o escolhido pelo 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. Usar \u00edndices parciais<\/b><\/p>\n<p><span style=\"font-weight: 400\">\u00c0s vezes, o predicado a ser indexado pode n\u00e3o caber em um n\u00f3 devido a limita\u00e7\u00f5es de tamanho.  Por enquanto, os GSI no Couchbase n\u00e3o s\u00e3o particionados automaticamente. Isso exige que o administrador crie \u00edndices parciais; as consultas N1QL s\u00e3o inteligentes o suficiente para escolher o \u00edndice apropriado com base no tipo de predicado usado na consulta quando os \u00edndices parciais est\u00e3o presentes. <\/span><\/p>\n<p><span style=\"font-weight: 400\">Por exemplo, criamos os dois \u00edndices a seguir com base no fato de o nome estar em dois intervalos 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\">Agora, as consultas a seguir escolher\u00e3o automaticamente o \u00edndice adequado, conforme evidenciado nos respectivos EXPLAIN PLANS:<\/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\">Os \u00edndices s\u00e3o escolhidos adequadamente ao usar a cl\u00e1usula LIKE no predicado. <\/span><span style=\"font-weight: 400\">Por exemplo, digamos que queremos obter todos os nomes que soam como um nome franc\u00eas (come\u00e7ando com \"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. Op\u00e7\u00f5es de consist\u00eancia<\/b><\/p>\n<p><span style=\"font-weight: 400\">Devido \u00e0 sua natureza ass\u00edncrona, os GSI no Couchbase acabam sendo consistentes por padr\u00e3o e, como j\u00e1 mencionado, s\u00e3o atualizados de forma ass\u00edncrona. Embora, usando feeds de altera\u00e7\u00e3o (DCP), atualizemos os \u00edndices o mais r\u00e1pido poss\u00edvel, \u00e9 bem poss\u00edvel que certas muta\u00e7\u00f5es de documentos n\u00e3o tenham sido atualizadas nos \u00edndices. Se a sem\u00e2ntica da consulta exigir uma consist\u00eancia de dados mais r\u00edgida, o Couchbase oferecer\u00e1 modelos de consist\u00eancia ajust\u00e1veis no momento da consulta.<\/span><\/p>\n<p><span style=\"font-weight: 400\">As tr\u00eas op\u00e7\u00f5es de consist\u00eancia dispon\u00edveis no Couchbase s\u00e3o:<\/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=request_plus<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400\">Para saber mais: <\/span><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/architecture\/querying-data-with-n1ql.html\"><span style=\"font-weight: 400\">Link de documenta\u00e7\u00e3o<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400\">Embora a sem\u00e2ntica request_plus imponha a integridade dos dados, h\u00e1 um impacto sobre o desempenho \u00e0 medida que as lat\u00eancias de consulta aumentam; a consulta aguarda que o \u00edndice relevante se atualize com as \u00faltimas muta\u00e7\u00f5es antes que os dados sejam retornados. 'not_bounded' (a op\u00e7\u00e3o de consist\u00eancia padr\u00e3o) \u00e9 a mais r\u00e1pida de todas as tr\u00eas op\u00e7\u00f5es de consist\u00eancia.<\/span><\/p>\n<p><b>11. Monitoramento do \u00edndice de recupera\u00e7\u00e3o<\/b><\/p>\n<p>Geralmente, o servi\u00e7o de \u00edndice recupera as muta\u00e7\u00f5es de documentos muito rapidamente, de modo a causar pouco ou nenhum impacto no usu\u00e1rio. Mas, como administrador, se voc\u00ea quiser ter certeza de que as muta\u00e7\u00f5es de documentos (a serem atualizadas no \u00edndice) sejam as m\u00ednimas poss\u00edveis e n\u00e3o continuem aumentando, observe a m\u00e9trica \"itens restantes\" sob o nome do \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. Usar compila\u00e7\u00f5es Defer<\/b><\/p>\n<p><span style=\"font-weight: 400\">As compila\u00e7\u00f5es diferidas oferecem um processo de cria\u00e7\u00e3o de \u00edndices em dois est\u00e1gios. Recomenda-se que os Defer Builds sejam sempre utilizados da melhor forma poss\u00edvel, pois o mesmo feed de altera\u00e7\u00f5es \u00e9 usado para criar \u00edndices em um n\u00f3. Se as compila\u00e7\u00f5es DEFER n\u00e3o forem usadas, o feed de altera\u00e7\u00f5es dos n\u00f3s de dados precisar\u00e1 ser acessado v\u00e1rias vezes, o que resultar\u00e1 em mais transfer\u00eancia de dados pela rede e em uma carga ligeiramente maior nos n\u00f3s de dados.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Exemplo:<\/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 obter mais informa\u00e7\u00f5es sobre a sintaxe CREATE INDEX, consulte a se\u00e7\u00e3o <\/span><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.0\/n1ql\/n1ql-language-reference\/createindex.html\"><span style=\"font-weight: 400\">Documenta\u00e7\u00e3o<\/span><\/a><span style=\"font-weight: 400\">.<\/span><\/p>\n<p><b>13. Evite chaves grandes para indexar<\/b><\/p>\n<p>Antes da vers\u00e3o 5.0, havia uma limita\u00e7\u00e3o no tamanho da chave para \u00edndices (m\u00e1ximo de 4k). Essa limita\u00e7\u00e3o foi removida na vers\u00e3o 5.0. Observe que os \u00edndices s\u00e3o destinados a caminhos de acesso a dados, portanto, o modelo de dados e a consulta (com \u00edndices) devem ser estruturados para obter as informa\u00e7\u00f5es necess\u00e1rias no menor tempo poss\u00edvel. Embora os clientes possam ter qualquer n\u00famero de campos em um \u00edndice composto, o tamanho da chave do \u00edndice tamb\u00e9m cresce proporcionalmente.  Tamanhos de chave realmente grandes podem afetar o desempenho. Como regra geral, prefira ter 1kB como o tamanho combinado de todos os campos em um \u00edndice composto e, se isso n\u00e3o for poss\u00edvel, refatore as consultas adequadamente.<\/p>\n<p><b>14. USE CHAVES, evite \u00edndices<\/b><\/p>\n<p>N\u00e3o \u00e9 necess\u00e1rio que todas as consultas N1QL exijam \u00edndices. Se suas consultas N1QL puderem funcionar independentemente de \u00edndices, consultando diretamente os documentos usando chaves, a diretiva USE KEYS ser\u00e1 \u00fatil.<\/p>\n<p><span style=\"font-weight: 400\">Por exemplo:<\/span><\/p>\n<pre class=\"\">SELECT * FROM `travel-sample` USE KEYS [\"landmark_37588\"];<\/pre>\n<p><span style=\"font-weight: 400\">O plano de explica\u00e7\u00e3o resultante mostrar\u00e1 um KeyScan sendo executado (sem qualquer men\u00e7\u00e3o a um 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\">Isso \u00e9 mais um conhecimento do que uma pr\u00e1tica recomendada, pois o USE KEYS n\u00e3o usa \u00edndices para retornar resultados do servi\u00e7o de consulta. Embora seja altamente improv\u00e1vel que os clientes possam ter apenas consultas que sempre usem USE KEYS, isso pode ser \u00fatil nos casos extremos que exigem esse comportamento.<\/span><\/p>\n<p>Post longo!!! Mas espero que tenha sido \u00fatil para entender os bancos de dados e os \u00edndices e como a indexa\u00e7\u00e3o nas pr\u00e1ticas recomendadas do DBMS pode ajud\u00e1-lo a oferecer experi\u00eancias superiores aos clientes :)<\/p>\n<p>PS: Uma vis\u00e3o geral do GSI e as novidades do 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.7.1 (Yoast SEO v25.7) - 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\/pt\/database-indexing-best-practices\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\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\/pt\/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\":\"pt-BR\",\"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\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\",\"@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\/pt\/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\/pt\/database-indexing-best-practices\/","og_locale":"pt_BR","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\/pt\/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":"pt-BR","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":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/database-indexing-best-practices\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@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":"Blog do Couchbase","description":"Couchbase, o banco de dados 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":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@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, gerente de produtos","image":{"@type":"ImageObject","inLanguage":"pt-BR","@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 trabalha com desenvolvimento e gerenciamento de produtos e vem desenvolvendo plataformas e produtos de dados\/an\u00e1lise. Uma parte significativa de sua experi\u00eancia foi na Oracle, onde passou de engenheiro da equipe de Enterprise Manager da Oracle a gerente de produtos do conjunto de produtos de BI\/Analytics da Oracle. No passado, ele trabalhou em startups, ajudando a desenvolver produtos de aprendizado de m\u00e1quina\/NLP e sistemas de decis\u00e3o distribu\u00eddos. Ele est\u00e1 sempre por perto em @venkasub.","sameAs":["https:\/\/x.com\/venkasub"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/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","first_name":"Venkat","last_name":"Subramanian, Product Manager","user_url":"","author_category":"","description":"Venkat trabalha com desenvolvimento e gerenciamento de produtos e vem desenvolvendo plataformas e produtos de dados\/an\u00e1lise. Uma parte significativa de sua experi\u00eancia foi na Oracle, onde passou de engenheiro da equipe de Enterprise Manager da Oracle a gerente de produtos do conjunto de produtos de BI\/Analytics da Oracle. No passado, ele trabalhou em startups, ajudando a desenvolver produtos de aprendizado de m\u00e1quina\/NLP e sistemas de decis\u00e3o distribu\u00eddos. Ele est\u00e1 sempre por perto em @venkasub."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/4193","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/3013"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=4193"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/4193\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=4193"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=4193"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=4193"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=4193"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}