2017-08-29 41 views
0

我正在通过learn.coucbase.com上提供的N1QL免费CB110课程。Couchbase DISTINCT非常慢

在课程的随行工作簿下面的查询需要1分钟:

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

我有电子邮件的GSI。

下面的查询需要毫秒:

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

其中有我相信,DISTINCT的问题。

EXPLAIN揭示了这一点:

[ 
    { 
    "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\";" 
    } 
] 

为什么查询这么慢?我如何加快查询速度?

回答

0

对于模式的所有字符串与hotmail.com结尾匹配,做到以下几点:

CREATE INDEX ON第九couchmusic2(SUBSTR(电子邮件,-11,11),address.countryCode);

将LIKE谓词修改为:WHERE SUBSTR(email,-11,11)=“hotmail.com”; 显然,这仅适用于hotmail.com,您需要另一个索引。

Checkout TOKENS()函数以更灵活的方式对此进行索引。为了得到不同的值(当你有很大数量的项目与不同值的数量进行比较时),尝试MIN()优化以及它。 https://dzone.com/articles/count-amp-group-faster-using-n1ql