O N1QL no Couchbase percorreu um longo caminho desde que foi introduzido pela primeira vez no Couchbase Server 4.0. No Couchbase 5.0, as coisas foram levadas para o próximo nível em termos de desempenho. Na versão para desenvolvedores de março de 2017 do Couchbase 5.0, há aprimoramentos de desempenho para o N1QL na projeção de índice, aprimoramentos para CONTAGEM
e DISTINTO
e o tão solicitado ORDER BY
, LIMITE
e DESLOCAMENTO
operadores.
Então, o que foi feito especificamente para aprimorar todas essas áreas e como podemos aproveitar as mudanças?
Vejamos a projeção do índice, por exemplo. Ao criar um índice, você pode criar um com qualquer número de propriedades. Por exemplo, considere o seguinte índice:
1 |
CREATE INDEX idx ON default(type, firstname, lastname); |
A instrução acima criará um índice de cobertura no padrão
Balde para o tipo
, primeiro nome
e sobrenome
propriedades de um determinado documento.
Agora, digamos que criamos a seguinte consulta N1QL para recuperar alguns documentos com o parâmetro idx
que havíamos criado:
1 2 3 |
SELECT firstname DO padrão WHERE type = 'person' |
A consulta acima usaria o idx
e retornar apenas o índice primeiro nome
para cada documento correspondente. O conceito de consulta dessa forma não é novo, no entanto, o que acontece nos bastidores mudou. Você notará que, embora nosso índice tenha muitas chaves, estamos interessados apenas em um subconjunto ou, neste caso, em duas chaves.
Então, o que está acontecendo e por que isso é importante?
Nas versões anteriores do Couchbase, todas as chaves do índice eram levadas em consideração, independentemente de apenas um subconjunto ser usado. Como resultado, eram necessários mais rede, CPU e memória para acomodar o que estava acontecendo. Agora, esse não é o caso.
Então, como você sabe que a projeção de índice está acontecendo?
Faça um EXPLICAR
na consulta que você está executando:
1 2 3 |
EXPLAIN SELECT firstname DO padrão WHERE type = 'person' |
Nos resultados, você deverá ver algo relacionado a index_projection
que se parece com o seguinte:
1 2 3 4 5 6 7 8 |
... "index_projection": { "entry_keys": [ 0, 1 ] }, ... |
O chaves_de_entrada
será alterada com base em sua consulta. Por exemplo, e se adicionarmos um ONDE
condição assim?
1 2 3 |
SELECT firstname DO padrão WHERE type = 'person' AND lastname = 'Nic' |
No cenário acima, obteríamos um EXPLICAR
resultado que se parece com o seguinte:
1 2 3 4 5 6 7 8 9 |
... "index_projection": { "entry_keys": [ 0, 1, 2 ] }, ... |
Agora, a consulta acima não foi uma projeção de índice porque usamos todas as chaves em nosso índice de cobertura.
A criação de índices adequados em conjunto com a projeção de índices pode realmente ajudar no desempenho geral e no dimensionamento do cluster do Couchbase Server.
A projeção do índice não foi o único aprimoramento de desempenho feito na compilação de março de 2017, certo? É isso mesmo, há mais!
Vamos pegar o COUNT(DISTINCT)
por exemplo. Agora vamos usar essa operação na consulta a seguir:
1 2 |
EXPLAIN SELECT COUNT(DISTINCT type) DO padrão; |
Nos resultados, você notará que ele está usando IndexCountDistinctScan2
e o que ele está fazendo é armazenar todos os tipo
no índice e processando os valores distintos. Embora isso aconteça no indexador no Couchbase 5.0, anteriormente acontecia no serviço N1QL em edições anteriores. Ao transferir essa operação para o indexador, podemos obter ganhos significativos de desempenho.
Da mesma forma, pegue o DESLOCAMENTO
, LIMITE
e ORDER BY
operadores que podem ser usados em consultas N1QL. Veja a consulta a seguir, por exemplo:
1 2 3 4 5 6 |
EXPLAIN SELECT firstname DO padrão WHERE type = 'person' ORDER BY firstname LIMITE 1 OFFSET 1; |
Você notará que o LIMITE
, ORDER BY
e DESLOCAMENTO
aparecerão no indexador. Antes da versão 5.0, o LIMITE
apareceu no indexador, mas agora os outros também aparecem. Essa é uma grande vitória, pois nas versões anteriores do Couchbase, se você compensasse os resultados, o N1QL obteria um número X de resultados e descartaria tudo antes da compensação.
Para obter mais ajuda com o N1QL, consulte a seção Portal do desenvolvedor do Couchbase que contém uma grande quantidade de documentação útil para desenvolvedores.
" O exemplo "OFFSET, LIMIT e ORDER BY" deve ser
EXPLAIN SELECT firstname
DO padrão
WHERE type = 'person'
ORDER BY firstname
LIMITE 1
OFFSET 1;
Bem visto! Atualizei a consulta :-)