{"id":6792,"date":"2019-05-05T21:34:51","date_gmt":"2019-05-06T04:34:51","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=6792"},"modified":"2025-06-13T20:28:48","modified_gmt":"2025-06-14T03:28:48","slug":"query-optimization-in-nosql-couchbase-mongodb","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/query-optimization-in-nosql-couchbase-mongodb\/","title":{"rendered":"Enfoques para la optimizaci\u00f3n de consultas en NoSQL"},"content":{"rendered":"<blockquote><p>Un hombre volvi\u00f3 a casa despu\u00e9s de dar la vuelta al mundo durante once a\u00f1os.  Al d\u00eda siguiente, cuando le dijo a su mujer que iba a la tienda de la esquina, ella le pregunt\u00f3: \"\u00bfvas por el camino corto o por el largo?\".<\/p><\/blockquote>\n<p>Las consultas pueden ejecutarse de muchas formas distintas.  Todos los caminos conducen al mismo resultado de consulta.  La herramienta NoSQL y de optimizaci\u00f3n de consultas eval\u00faa las posibilidades y selecciona el plan eficiente. La eficiencia se mide en latencia y rendimiento, dependiendo de la carga de trabajo.  El coste del uso de memoria, CPU y disco se a\u00f1ade al coste de un plan en un optimizador basado en costes.<\/p>\n<p>Ahora bien, en la mayor\u00eda de los casos, un <a href=\"https:\/\/www.couchbase.com\/blog\/es\/resources\/why-nosql\/\">Base de datos NoSQL<\/a> tendr\u00e1 <a href=\"https:\/\/www.couchbase.com\/blog\/es\/unreasonable-effectiveness-of-sql\/\">Consulta tipo SQL<\/a> soporte de idiomas. Por lo tanto, un buen optimizador es obligatorio. Cuando no se dispone de un buen optimizador, los desarrolladores tienen que vivir con restricciones de funciones y los administradores de bases de datos tienen que vivir con problemas de rendimiento de las consultas NoSQL.<\/p>\n<p><strong>Optimizador de bases de datos para mejorar el rendimiento de las b\u00fasquedas NoSQL<\/strong><\/p>\n<p>La optimizaci\u00f3n de consultas NosSQL permite elegir un \u00edndice y unas rutas de acceso \u00f3ptimas para ejecutar la b\u00fasqueda. <span style=\"font-weight: 400\">A muy alto nivel, los optimizadores de SQL deciden lo siguiente antes de crear el \u00e1rbol de ejecuci\u00f3n:<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Reescritura de consultas basada en la heur\u00edstica, el coste o ambos.<\/span>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Al igual que un editor elimina las palabras innecesarias de un escrito, el trabajo de reescritura de consultas puede abarcar desde la eliminaci\u00f3n de predicados innecesarios hasta el aplanamiento de subconsultas, la conversi\u00f3n de LEFT OUTER JOINS adecuados en INNER JOINS, el plegado de tablas derivadas, etc.<\/span><\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Selecci\u00f3n del \u00edndice.<\/span>\n<ul>\n<li style=\"font-weight: 400\">Selecci\u00f3n del \u00edndice o \u00edndices \u00f3ptimos para cada una de las tablas (keyspaces en Couchbase N1QL, colecci\u00f3n en el caso de las mejores pr\u00e1cticas de rendimiento de MongoDB)<\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">En funci\u00f3n del \u00edndice seleccionado, elija los predicados que se van a empujar hacia abajo, vea si la consulta est\u00e1 cubierta o no, decida la estrategia de ordenaci\u00f3n y paginaci\u00f3n.<\/span><\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Reordenaci\u00f3n de uniones <\/span>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">(A INNER JOIN B INNER JOIN C) es equivalente a (B INNER JOIN C INNER JOIN A).  El optimizador tendr\u00e1 que determinar la forma m\u00e1s \u00f3ptima de secuenciar estas uniones.<\/span><\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Tipo de uni\u00f3n<\/span>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Las bases de datos pueden implementar m\u00faltiples tipos de algoritmos de uni\u00f3n: bucle anidado, hash, sort merge, zigzag, estrella (copo de nieve), etc.  En funci\u00f3n de la estructura y el coste, el optimizador tendr\u00e1 que decidir el tipo de algoritmo de uni\u00f3n para cada operaci\u00f3n de uni\u00f3n.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>Consideremos el caso de la restricci\u00f3n de MongoDB. <span style=\"font-weight: 400\">\"<\/span><span style=\"font-weight: 400\">Una colecci\u00f3n puede tener como m\u00e1ximo <\/span><b>un<\/b> <span style=\"font-weight: 400\">texto<\/span><span style=\"font-weight: 400\"> \u00edndice\".\u00a0 <\/span><a href=\"https:\/\/docs.mongodb.com\/manual\/core\/index-text\/#restrictions\"><span style=\"font-weight: 400\">https:\/\/docs.mongodb.com\/manual\/core\/index-text\/#restrictions<\/span><\/a><span style=\"font-weight: 400\"> Adem\u00e1s, documenta otras restricciones.  Para este art\u00edculo, bastar\u00e1 con explicar esta \u00fanica restricci\u00f3n.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-6794\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-24-at-2.38.16-PM-300x65.png\" alt=\"\" width=\"733\" height=\"159\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/Screen-Shot-2019-04-24-at-2.38.16-PM-300x65.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/Screen-Shot-2019-04-24-at-2.38.16-PM-1024x223.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/Screen-Shot-2019-04-24-at-2.38.16-PM-768x167.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/Screen-Shot-2019-04-24-at-2.38.16-PM-1536x335.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/Screen-Shot-2019-04-24-at-2.38.16-PM-20x4.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/Screen-Shot-2019-04-24-at-2.38.16-PM-1320x288.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/04\/Screen-Shot-2019-04-24-at-2.38.16-PM.png 1662w\" sizes=\"auto, (max-width: 733px) 100vw, 733px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p><strong>\u00bfPor qu\u00e9 deber\u00eda importarle esta restricci\u00f3n?<\/strong><\/p>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">MongoDB y otras bases de datos NoSQL le animan a desnormalizar (agregar) su esquema para crear un \u00fanico documento de gran tama\u00f1o que representa un objeto: un cliente, un socio, etc por lo que la mayor\u00eda de sus operaciones ocurren en un \u00fanico documento (JSON).  As\u00ed, un \u00fanico documento de cliente puede contener informaci\u00f3n del cliente, pedidos de clientes, informaci\u00f3n de env\u00edo del cliente, informaci\u00f3n de facturaci\u00f3n del cliente. <\/span>Tener un \u00fanico \u00edndice de b\u00fasqueda significa que tienes que crear un \u00fanico \u00edndice MUY GRANDE que combine todos los campos en los que quieras buscar.  Este es el problema: cuando busca la direcci\u00f3n del cliente, no quiere ver la direcci\u00f3n de env\u00edo. Cuando busque el ID de pedido de env\u00edo, no querr\u00e1 ver el ID de pedido devuelto.<\/li>\n<li style=\"font-weight: 400\">En MongoDB se pueden crear m\u00faltiples \u00edndices sobre escalares.  Por qu\u00e9 la restricci\u00f3n en el \u00edndice de texto?<\/li>\n<\/ol>\n<p><strong>\u00bfPor qu\u00e9 el \u00edndice de texto de MongoDB est\u00e1 restringido a un \u00edndice por colecci\u00f3n?\u00a0\u00a0<\/strong><\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li>\u00bfEs el n\u00famero de \u00edndices de texto? Los \u00edndices de b\u00fasqueda se construyen normalmente con un <a href=\"https:\/\/en.wikipedia.org\/wiki\/Inverted_index\">estructura de datos de \u00e1rbol invertido<\/a>.  Pero.., <a href=\"https:\/\/www.couchbase.com\/blog\/es\/searching-json-comparing-text-search-in-couchbase-and-mongodb\/\">MongoDB ha optado por construir<\/a> con el \u00edndice B-Tree.  Es poco probable que este sea el problema.<\/li>\n<li>\u00bfEs el tama\u00f1o de los \u00edndices de texto?  Los \u00edndices de texto generan un array de tokens sobre el texto y los indexa.  Por lo tanto, es un \u00edndice de matriz.  Su tama\u00f1o puede crecer exponencialmente cuando se utiliza un \u00edndice de matriz. El tama\u00f1o del \u00edndice aumenta linealmente al n\u00famero de palabras indexadas y no al n\u00famero de documentos.  Esto puede causar problemas.<\/li>\n<li>\u00bfEs un problema del optimizador?  Cuando tienes varios \u00edndices, el optimizador tendr\u00e1 que elegir el \u00edndice adecuado para la consulta.  Si se restringe a un \u00edndice de texto, la elecci\u00f3n es f\u00e1cil. Esto es un s\u00edntoma de un problema mayor en las t\u00e9cnicas de optimizaci\u00f3n de MongoDB - Toma decisiones adhoc que resultan en restricciones como esta.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400\">El lenguaje de planes de consulta de MongoDB es simplista, aunque intente <\/span><a href=\"https:\/\/docs.mongodb.com\/manual\/reference\/sql-comparison\/\"><span style=\"font-weight: 400\">imitan las operaciones SQL.<\/span><\/a><span style=\"font-weight: 400\">.  Veamos c\u00f3mo gestiona esto la herramienta de optimizaci\u00f3n de consultas de MongoDB.<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Reescritura de consultas: \u00a0<strong>Sin soporte<\/strong>. Las consultas de MongoDB son simplistas en los m\u00e9todos find(), save(), remove(), update(). La tuber\u00eda de agregaci\u00f3n es procedimental y verbosa. Aunque te\u00f3ricamente es posible reescribir, no hay nada en la documentaci\u00f3n o en el plan que indique una reescritura de las consultas.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Selecci\u00f3n del \u00edndice: <strong>Soporte<\/strong>.  El optimizador de MongoDB intenta elegir un \u00edndice adecuado para cada parte de la consulta y el \u00edndice puede\/debe ser utilizado. M\u00e1s sobre esto a continuaci\u00f3n.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Reordenaci\u00f3n de uniones: <strong>Sin soporte<\/strong>. $lookup de MongoDB forma parte del enrevesado marco de agregaci\u00f3n en el que la consulta se escribe como el pipeline de Unix, un enfoque procedimental. \u00a0<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Selecci\u00f3n del tipo de uni\u00f3n: <strong>Sin soporte<\/strong> ya que s\u00f3lo hay un tipo de join en MongoDB.  MongoDB tiene un soporte de uni\u00f3n exterior izquierda restringida a trav\u00e9s del operador $lookup - las matrices no est\u00e1n soportadas en la condici\u00f3n de uni\u00f3n.  Si utiliza $lookup, el optimizador utilizar\u00e1 autom\u00e1ticamente el algoritmo de uni\u00f3n predeterminado.  No se menciona el tipo de uni\u00f3n realizada.\u00a0\u00a0<\/span><\/li>\n<\/ol>\n<p><span style=\"font-weight: 400\">Esencialmente, la optimizaci\u00f3n de consultas de MongoDB s\u00f3lo hace la selecci\u00f3n de \u00edndices antes de crear el plan de ejecuci\u00f3n. Pero, la optimizaci\u00f3n de consultas en MongoDB parece seleccionar los \u00edndices de una manera extra\u00f1a - ni por regla ni por estad\u00edstica. \u00a0<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Elige un \u00edndice aleatorio en uno o varios \u00edndices cualificados.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Utilice ese plan si una consulta posterior coincide con los predicados de la consulta, aunque las constantes, selectividades y cardinalidades sean diferentes.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Luego, en tiempo de ejecuci\u00f3n, si el escaneo del \u00edndice devuelve m\u00e1s de 100 claves (\u00a1!), ejecuta cada uno de los planes alternativos para ver cu\u00e1l devuelve las claves primero.  En alg\u00fan momento, aborta la ejecuci\u00f3n paralela y recoge uno de ellos. Tambi\u00e9n sustituye el plan en su cach\u00e9 de planes.<\/span><\/li>\n<\/ol>\n<pre title=\"Definici\u00f3n del \u00edndice MongoDB\" class=\"theme:github font-size:15 scroll:true whitespace-before:1 whitespace-after:1 lang:default decode:true\">Colecci\u00f3n t1, con 3000 documenbts.\r\n\r\nCree los siguientes \u00edndices:  Ap\u00e9ndice 1 para la definici\u00f3n:\r\n\r\nMongoDB Enterprise &gt; db.t1.createIndex({x:1})\r\nMongoDB Enterprise &gt; db.t1.createIndex({y:1})\r\nMongoDB Enterprise &gt; db.t1.createIndex({x:1, y:1})\r\nMongoDB Enterprise &gt; db.t1.createIndex({y:1, x:1})\r\n\r\n<\/pre>\n<p>Se trata de una \u00fanica colecci\u00f3n con 4 \u00edndices en (x), (y), (x, y) e (y, x).  Ahora, mira esto:<\/p>\n<pre class=\"theme:github font-size:15 wrap:true whitespace-before:1 whitespace-after:1 lang:js decode:true\">MongoDB Enterprise &gt; db.t1.find({x:{$gt:0}, y:99}).explain()\r\n{\r\n\t\"queryPlanner\" : {\r\n\t\t\"plannerVersion\" : 1,\r\n\t\t\"namespace\" : \"test.t1\",\r\n\t\t\"indexFilterSet\" : false,\r\n\t\t\"parsedQuery\" : {\r\n\t\t\t\"$and\" : [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"y\" : {\r\n\t\t\t\t\t\t\"$eq\" : 99\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\t\"x\" : {\r\n\t\t\t\t\t\t\"$gt\" : 0\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t]\r\n\t\t},\r\n\t\t\"winningPlan\" : {\r\n\t\t\t\"stage\" : \"FETCH\",\r\n\t\t\t\"filter\" : {\r\n\t\t\t\t\"x\" : {\r\n\t\t\t\t\t\"$gt\" : 0\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t\"inputStage\" : {\r\n\t\t\t\t\"stage\" : \"IXSCAN\",\r\n\t\t\t\t\"keyPattern\" : {\r\n\t\t\t\t\t\"y\" : 1\r\n\t\t\t\t},\r\n\t\t\t\t\"indexName\" : \"y_1\",\r\n\t\t\t\t\"isMultiKey\" : false,\r\n\t\t\t\t\"multiKeyPaths\" : {\r\n\t\t\t\t\t\"y\" : [ ]\r\n\t\t\t\t},\r\n\t\t\t\t\"isUnique\" : false\r\n\t\t\t\t\"isSparse\" : false\r\n\t\t\t\t\"isPartial\" : false,\r\n\t\t\t\t\"indexVersion\" : 2,\r\n\t\t\t\t\"direction\" : \"forward\",\r\n\t\t\t\t\"indexBounds\" : {\r\n\t\t\t\t\t\"y\" : [\r\n\t\t\t\t\t\t\"[99.0, 99.0]\"\r\n\t\t\t\t\t]\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n<\/pre>\n<p>Incluso en esta estructura de documento simple, MongoDB selecciona el \u00edndice en (y) aunque all\u00ed la consulta tenga filtros en x e y: <strong>({x:{$gt:0}, y:99})<\/strong>.<\/p>\n<p>Para gestionar todas estas incertidumbres y los problemas de rendimiento que provocar\u00e1, MongoDB proporciona un <a href=\"https:\/\/docs.mongodb.com\/manual\/reference\/method\/js-plan-cache\/\">n\u00famero de API para gestionar la cach\u00e9 del plan de consulta<\/a>Flush: vaciar una entrada espec\u00edfica de la cach\u00e9, vaciar toda la cach\u00e9 de planes.   En lugar de desarrollar aplicaciones, los desarrolladores y DBAs de MongoDB necesitan gestionar la cach\u00e9 de planes.   Los desarrolladores y administradores de bases de datos no necesitan gestionar la cach\u00e9 de planes en otras bases de datos empresariales.<\/p>\n<p>Volviendo a la pregunta original: <strong><em>\u00bfPor qu\u00e9 no se pueden crear m\u00faltiples \u00edndices de texto en MongoDB?<\/em><\/strong><\/p>\n<p>Construir m\u00faltiples \u00edndices no deber\u00eda ser un problema si simplemente lo permitieran.  El\u00a0<strong>verdadero problema<\/strong> es que cuando se da un predicado de texto en la consulta, el optimizador de MongoDB no puede elegir el \u00edndice correcto.  No puede validar estos \u00edndices de texto contra el predicado de texto.  El optimizador de MongoDB no sigue una l\u00f3gica natural o un marco l\u00f3gico.   De ah\u00ed la restricci\u00f3n.<\/p>\n<p><em>E incluso podr\u00eda hacerte da\u00f1o.<\/em><\/p>\n<blockquote class=\"twitter-tweet\" data-lang=\"en\">\n<p dir=\"ltr\" lang=\"en\">Me gusta mucho <a href=\"https:\/\/twitter.com\/hashtag\/MongoDB?src=hash&amp;ref_src=twsrc%5Etfw\">#MongoDB<\/a> pero escribir consultas en JSON es doloroso (especialmente la agregaci\u00f3n). Es un infierno de par\u00e9ntesis rizados con poco soporte de herramientas. Lo mismo ocurre con <a href=\"https:\/\/twitter.com\/hashtag\/ElasticSearch?src=hash&amp;ref_src=twsrc%5Etfw\">#ElasticSearch<\/a>. Afortunadamente, gracias a las librer\u00edas Java\/Kotlin, rara vez tenemos que escribirlos directamente. Pero cuando tenemos que hacerlo, duele.<\/p>\n<p>- Philipp Hauer (@philipp_hauer) <a href=\"https:\/\/twitter.com\/philipp_hauer\/status\/1118804630635515905?ref_src=twsrc%5Etfw\">18 de abril de 2019<\/a><\/p><\/blockquote>\n<p>Couchbase N1QL ha a\u00f1adido \u00edndice de texto a N1QL para la pr\u00f3xima versi\u00f3n.  Vea los detalles en <a href=\"https:\/\/www.couchbase.com\/blog\/es\/n1ql-and-search-how-to-leverage-fts-index-in-n1ql-query\/\">https:\/\/www.couchbase.com\/blog\/n1ql-and-search-how-to-leverage-fts-index-in-n1ql-query\/<\/a>. Los usuarios pueden crear cualquier n\u00famero de \u00edndices de texto y el optimizador elegir\u00e1 un \u00edndice cualificado (sargable) y lo utilizar\u00e1.  Tambi\u00e9n permite realizar b\u00fasquedas durante las uniones, las exploraciones posteriores al \u00edndice, etc., ya que el optimizador entiende el predicado de b\u00fasqueda y lo incorpora a su l\u00f3gica de decisi\u00f3n.  No hay una nueva API ni un nuevo plan que gestionar. \u00a1Ese es el poder de tener Couchbase!<\/p>\n<h5 style=\"margin-bottom: 46.8359px\"><strong>Recursos:<\/strong><\/h5>\n<ol>\n<li>Visi\u00f3n general de la optimizaci\u00f3n de consultas en sistemas relacionales: <a href=\"https:\/\/web.stanford.edu\/class\/cs345d-01\/rl\/chaudhuri98.pdf\">https:\/\/web.stanford.edu\/class\/cs345d-01\/rl\/chaudhuri98.pdf<\/a><\/li>\n<li>Una inmersi\u00f3n profunda en la optimizaci\u00f3n de consultas N1QL de Couchbase: <a href=\"https:\/\/dzone.com\/articles\/a-deep-dive-into-couchbase-n1ql-query-optimization\">https:\/\/dzone.com\/articles\/a-deep-dive-into-couchbase-n1ql-query-optimization<\/a><\/li>\n<li><a href=\"https:\/\/docs.mongodb.com\/manual\/reference\/method\/js-plan-cache\/\"><span style=\"font-weight: 400\">https:\/\/docs.mongodb.com\/manual\/reference\/method\/js-plan-cache\/<\/span><\/a><\/li>\n<li><a href=\"https:\/\/docs.mongodb.com\/manual\/core\/query-plans\/\"><span style=\"font-weight: 400\">https:\/\/docs.mongodb.com\/manual\/core\/query-plans\/<\/span><\/a><\/li>\n<li><a href=\"https:\/\/docs.mongodb.com\/manual\/reference\/method\/js-plan-cache\/\"><span style=\"font-weight: 400\">https:\/\/docs.mongodb.com\/manual\/reference\/method\/js-plan-cache\/<\/span><\/a><\/li>\n<\/ol>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>A man returned home after walking around the globe for eleven years.\u00a0 Next day, when he told his wife he&#8217;s going to the corner store, she asked him: &#8220;are you taking the short route or the long one?&#8221;. Queries can [&hellip;]<\/p>","protected":false},"author":55,"featured_media":4938,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,2165,1812],"tags":[1505,1261,1309,1725,1906],"ppma_author":[8929],"class_list":["post-6792","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-full-text-search","category-n1ql-query","tag-index","tag-json","tag-mongodb","tag-nosql-database","tag-optimizer"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Query Optimization in NoSQL and MongoDB Performance Plan<\/title>\n<meta name=\"description\" content=\"The NoSQL and query optimization tool evaluates the possibilities and selects the efficient plan. Find out what to do when you don\u2019t have a good optimizer.\" \/>\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\/query-optimization-in-nosql-couchbase-mongodb\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Approaches to Query Optimization in NoSQL\" \/>\n<meta property=\"og:description\" content=\"The NoSQL and query optimization tool evaluates the possibilities and selects the efficient plan. Find out what to do when you don\u2019t have a good optimizer.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/query-optimization-in-nosql-couchbase-mongodb\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-05-06T04:34:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:28:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-03-at-10.08.36-AM.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1388\" \/>\n\t<meta property=\"og:image:height\" content=\"744\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Keshav Murthy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@rkeshavmurthy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Keshav Murthy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/\"},\"author\":{\"name\":\"Keshav Murthy\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c261644262bf98e146372fe647682636\"},\"headline\":\"Approaches to Query Optimization in NoSQL\",\"datePublished\":\"2019-05-06T04:34:51+00:00\",\"dateModified\":\"2025-06-14T03:28:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/\"},\"wordCount\":1365,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-03-at-10.08.36-AM.png\",\"keywords\":[\"Index\",\"JSON\",\"mongodb\",\"NoSQL Database\",\"Optimizer\"],\"articleSection\":[\"Couchbase Server\",\"Full-Text Search\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/\",\"name\":\"Query Optimization in NoSQL and MongoDB Performance Plan\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-03-at-10.08.36-AM.png\",\"datePublished\":\"2019-05-06T04:34:51+00:00\",\"dateModified\":\"2025-06-14T03:28:48+00:00\",\"description\":\"The NoSQL and query optimization tool evaluates the possibilities and selects the efficient plan. Find out what to do when you don\u2019t have a good optimizer.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-03-at-10.08.36-AM.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-03-at-10.08.36-AM.png\",\"width\":1388,\"height\":744},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Approaches to Query Optimization in NoSQL\"}]},{\"@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\/c261644262bf98e146372fe647682636\",\"name\":\"Keshav Murthy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4e51d72fc07c662aa791316deafffac4\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g\",\"caption\":\"Keshav Murthy\"},\"description\":\"Keshav Murthy is a Vice President at Couchbase R&amp;D. Previously, he was at MapR, IBM, Informix, Sybase, with more than 20 years of experience in database design &amp; development. He lead the SQL and NoSQL R&amp;D team at IBM Informix. He has received two President's Club awards at Couchbase, two Outstanding Technical Achievement Awards at IBM. Keshav has a bachelor's degree in Computer Science and Engineering from the University of Mysore, India, holds eleven US patents and has four US patents pending.\",\"sameAs\":[\"https:\/\/blog.planetnosql.com\/\",\"https:\/\/x.com\/rkeshavmurthy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/keshav-murthy\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Query Optimization in NoSQL and MongoDB Performance Plan","description":"La herramienta de optimizaci\u00f3n de consultas y NoSQL eval\u00faa las posibilidades y selecciona el plan eficiente. Descubre qu\u00e9 hacer cuando no tienes un buen optimizador.","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\/query-optimization-in-nosql-couchbase-mongodb\/","og_locale":"es_MX","og_type":"article","og_title":"Approaches to Query Optimization in NoSQL","og_description":"The NoSQL and query optimization tool evaluates the possibilities and selects the efficient plan. Find out what to do when you don\u2019t have a good optimizer.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/query-optimization-in-nosql-couchbase-mongodb\/","og_site_name":"The Couchbase Blog","article_published_time":"2019-05-06T04:34:51+00:00","article_modified_time":"2025-06-14T03:28:48+00:00","og_image":[{"width":1388,"height":744,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-03-at-10.08.36-AM.png","type":"image\/png"}],"author":"Keshav Murthy","twitter_card":"summary_large_image","twitter_creator":"@rkeshavmurthy","twitter_misc":{"Written by":"Keshav Murthy","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/"},"author":{"name":"Keshav Murthy","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c261644262bf98e146372fe647682636"},"headline":"Approaches to Query Optimization in NoSQL","datePublished":"2019-05-06T04:34:51+00:00","dateModified":"2025-06-14T03:28:48+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/"},"wordCount":1365,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-03-at-10.08.36-AM.png","keywords":["Index","JSON","mongodb","NoSQL Database","Optimizer"],"articleSection":["Couchbase Server","Full-Text Search","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/","url":"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/","name":"Query Optimization in NoSQL and MongoDB Performance Plan","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-03-at-10.08.36-AM.png","datePublished":"2019-05-06T04:34:51+00:00","dateModified":"2025-06-14T03:28:48+00:00","description":"La herramienta de optimizaci\u00f3n de consultas y NoSQL eval\u00faa las posibilidades y selecciona el plan eficiente. Descubre qu\u00e9 hacer cuando no tienes un buen optimizador.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-03-at-10.08.36-AM.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/04\/Screen-Shot-2018-04-03-at-10.08.36-AM.png","width":1388,"height":744},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/query-optimization-in-nosql-couchbase-mongodb\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Approaches to Query Optimization in NoSQL"}]},{"@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\/c261644262bf98e146372fe647682636","name":"Keshav Murthy","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4e51d72fc07c662aa791316deafffac4","url":"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g","caption":"Keshav Murthy"},"description":"Keshav Murthy es Vicepresidente de Couchbase R&amp;D. Anteriormente, estuvo en MapR, IBM, Informix, Sybase, con m\u00e1s de 20 a\u00f1os de experiencia en dise\u00f1o y desarrollo de bases de datos. Dirigi\u00f3 el equipo de I+D de SQL y NoSQL en IBM Informix. Ha recibido dos premios President's Club en Couchbase y dos premios Outstanding Technical Achievement en IBM. Keshav es licenciado en Inform\u00e1tica e Ingenier\u00eda por la Universidad de Mysore (India), es titular de once patentes estadounidenses y tiene cuatro pendientes.","sameAs":["https:\/\/blog.planetnosql.com\/","https:\/\/x.com\/rkeshavmurthy"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/keshav-murthy\/"}]}},"authors":[{"term_id":8929,"user_id":55,"is_guest":0,"slug":"keshav-murthy","display_name":"Keshav Murthy","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g","author_category":"","last_name":"Murthy","first_name":"Keshav","job_title":"","user_url":"https:\/\/blog.planetnosql.com\/","description":"Keshav Murthy es Vicepresidente de Couchbase R&amp;D. Anteriormente, estuvo en MapR, IBM, Informix, Sybase, con m\u00e1s de 20 a\u00f1os de experiencia en dise\u00f1o y desarrollo de bases de datos. Dirigi\u00f3 el equipo de I+D de SQL y NoSQL en IBM Informix. Ha recibido dos premios President's Club en Couchbase y dos premios Outstanding Technical Achievement en IBM. Keshav es licenciado en Inform\u00e1tica e Ingenier\u00eda por la Universidad de Mysore (India), es titular de diez patentes estadounidenses y tiene tres pendientes."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/6792","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\/55"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=6792"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/6792\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/4938"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=6792"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=6792"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=6792"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=6792"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}