2016-05-31 149 views
2

我正在使用Couchbase 4.1的项目上工作,我们正在尝试使用N1QL来查询文档。问题是,即使我创建了indexees,它看起来很慢。查询需要大约2秒钟,约11000个文档。Couchbase N1QL查询真的很慢

查询:

SELECT name, displayName, imageId, childCategories FROM `bd-couchbase` WHERE assortment = 'CategoryAssortmentOne' AND categoryPath = 'category-displayname/subcategory-displayName' AND displayName IS NOT MISSING 

我的文档看起来像这样:

{ 
    "parentName": "8442", 
    "categoryPath": "category-displayname/subcategory-displayName", 
    "lastUpdated": "2016-05-31T11:02:03.5129252+02:00", 
    "childCategories": [ 
    { 
     "name": "0041", 
     "displayName": "Category 1", 
     "imageId": "0041" 
    }, 
    { 
     "name": "0042", 
     "displayName": "Category 2", 
     "imageId": "0042" 
    }, 
    { 
     "name": "0043", 
     "displayName": "Category 3", 
     "imageId": "0043" 
    }, 
    { 
     "name": "0044", 
     "displayName": "Category 4", 
     "imageId": "0044" 
    }, 
    { 
     "name": "0045", 
     "displayName": "Category 5", 
     "imageId": "0045" 
    }, 
    { 
     "name": "0046", 
     "displayName": "Category 6", 
     "imageId": "0046" 
    } 
    ], 
    "assortment": "CategoryAssortmentOne", 
    "name": "0040", 
    "displayName": "MyCategory", 
    "imageId": "0040" 
} 

我有以下指标:

CREATE INDEX `category_idx` ON `bd-couchbase`((meta().`id`),`name`,`displayName`,`imageId`,`categoryPath`,`childCategories`,`assortment`) USING GSI; 

当我执行的解释,我可以看到它使用#primary索引,然后做一个提取(我猜是查询的慢部分)。但是,当我创建我的索引是不是应该使用它?

我的解释结果:

{ 
    "requestID": "da1946f3-5cc8-4d1e-a05b-06789aa6be92", 
    "signature": "json", 
    "results": [ 
     { 
      "#operator": "Sequence", 
      "~children": [ 
       { 
        "#operator": "PrimaryScan", 
        "index": "#primary", 
        "keyspace": "my-couchbase", 
        "namespace": "default", 
        "using": "gsi" 
       }, 
       { 
        "#operator": "Parallel", 
        "~child": { 
         "#operator": "Sequence", 
         "~children": [ 
          { 
           "#operator": "Fetch", 
           "keyspace": "my-couchbase", 
           "namespace": "default" 
          }, 
          { 
           "#operator": "Filter", 
           "condition": "((((`my-couchbase`.`assortment`) = 
\"CategoryAssortmentOne\") and ((`my-couchbase`.`categoryPath`) = \"category-displayname/subcategory-displayName\")) and ((`my-couchbase`.`displayName`) is not missing))" 
          }, 
          { 
           "#operator": "InitialProject", 
           "result_terms": [ 
            { 
             "expr": "(`my-couchbase`.`name`)" 
            }, 
            { 
             "expr": "(`my-couchbase`.`displayName`)" 

            }, 
            { 
             "expr": "(`my-couchbase`.`imageId`)" 
            }, 
            { 
             "expr": "(`my-couchbase`.`childCategorie 
s`)" 
            } 
           ] 
          }, 
          { 
           "#operator": "FinalProject" 
          } 
         ] 
        } 
       } 
      ] 
     } 
    ], 
    "status": "success", 
    "metrics": { 
     "elapsedTime": "13.6696ms", 
     "executionTime": "13.6696ms", 
     "resultCount": 1, 
     "resultSize": 2089 
    } 
} 

有什么建议?

在此先感谢。

回答

3

查询服务似乎无法将您的索引与查询匹配。您在索引中包含meta.id的任何特定原因?

尝试重新定义索引以仅覆盖WHERE子句中使用的字段:assortment,categoryPathdisplayName,然后查看它是否在EXPLAIN中被提及。

CREATE INDEX category_idx ON `bd-couchbase`(assortment, categoryPath, displayName, imageId, childCategories, name); 
+1

CREATE INDEX category_idx ON \'bd-couchbase \'(assortment,categoryPath,displayName,imageId,childCategories,name); – geraldss

+0

好吧,所以我只应该包含用于我的WHERE语句的字段?明天我会试试看。 – Martin

+2

不,问题是CREATE INDEX中字段的顺序。 – geraldss