2017-08-29 3 views
0

私はlearn.coucbase.comで提供されているN1QLの無料CB110コースを利用しています。Couchbase DISTINCT非常に遅い

SELECT DISTINCT address.countryCode 
FROM couchmusic2 
WHERE email LIKE "%hotmail.com"; 

私は電子メールにGSIを持っている:もちろんの伴うワークブックの

次のクエリでは、1分かかります。私はDISTINCTが問題であると信じて持って

SELECT COUNT(*) 
FROM couchmusic2 
WHERE email LIKE "%hotmail.com"; 

:クエリ後

はミリ秒かかります。

[ 
    { 
    "plan": { 
     "#operator": "Sequence", 
     "~children": [ 
     { 
      "#operator": "IndexScan", 
      "index": "idx_email", 
      "index_id": "c2e612a0d697d8b6", 
      "keyspace": "couchmusic2", 
      "namespace": "default", 
      "spans": [ 
      { 
       "Range": { 
       "High": [ 
        "[]" 
       ], 
       "Inclusion": 1, 
       "Low": [ 
        "\"\"" 
       ] 
       } 
      } 
      ], 
      "using": "gsi" 
     }, 
     { 
      "#operator": "Fetch", 
      "keyspace": "couchmusic2", 
      "namespace": "default" 
     }, 
     { 
      "#operator": "Parallel", 
      "~child": { 
      "#operator": "Sequence", 
      "~children": [ 
       { 
       "#operator": "Filter", 
       "condition": "((`couchmusic2`.`email`) like \"%hotmail.com\")" 
       }, 
       { 
       "#operator": "InitialProject", 
       "distinct": true, 
       "result_terms": [ 
        { 
        "expr": "((`couchmusic2`.`address`).`countryCode`)" 
        } 
       ] 
       }, 
       { 
       "#operator": "Distinct" 
       }, 
       { 
       "#operator": "FinalProject" 
       } 
      ] 
      } 
     }, 
     { 
      "#operator": "Distinct" 
     } 
     ] 
    }, 
    "text": "\nSELECT DISTINCT address.countryCode \nFROM couchmusic2 \nWHERE email LIKE \"%hotmail.com\";" 
    } 
] 

なぜクエリがとても遅いです:?

はこれを明らかにEXPLAINどのようにこのクエリを高速化するのですか?

答えて

0

countクエリでは、対象インデックスが使用されます。 DISTINCTクエリに対して次のインデックスを試してください。

CREATE INDEX ix1 ON couchmusic2(email、address.countryCode);

先頭の%のLIKEは、indexScanを完了する必要があります。 hotmail.comで終わるすべての文字列のためのパターンマッチングについてhttps://dzone.com/articles/a-couchbase-index-technique-for-like-predicates-wi

0

これをチェックしてください、次の操作を行います。

couchmusic2 ON INDEXのIX(SUBSTR(電子メール、-11、11)、address.countryCode)を作成します。

次のようにLIKE述語を変更します。WHERE SUBSTR(email、-11、11)= "hotmail.com"; 明らかに、これはhotmail.comにのみ適しています。別のインデックスが必要です。

これをより柔軟にインデックス化するためのTOKENS()関数をチェックアウトします。

個別の値を取得するには(個別の値の数と比較して項目の数が非常に多い場合)、MIN()最適化を試してください。 https://dzone.com/articles/count-amp-group-faster-using-n1ql