2016-05-31 156 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