Com o servidor Couchbase 4,0 GA - apresentamos a você o N1QL, que foi um facilitador essencial para desenvolver com agilidade e operar em escala! Agora, temos o prazer de anunciar o versão prévia para desenvolvedores do 4.1 - que tem correções de estabilidade valiosas. Dentro disso, há um recurso importante chamado Covering Indexes.
O Covering Index é um novo e empolgante recurso do N1QL na versão 4.1 que permite que um aplicativo, que o aproveite adequadamente, reconheça uma melhoria notável no desempenho da consulta em muitos casos. Uma consulta coberta é uma consulta N1QL na qual todos os campos da consulta fazem parte de um índice, e todos os campos retornados na consulta estão no mesmo índice.
Antes desse aprimoramento, se você der uma olhada no fluxo de execução da consulta, ele é o seguinte:
-
O cliente do aplicativo emite uma solicitação de consulta ao servidor por meio de uma API Rest
-
O serviço de consulta passa por uma fase de análise e análise e gera um plano de consulta.
-
O serviço de consulta emite solicitações de varredura para o serviço de índice se houver um índice válido para a situação
-
Obtém de volta as chaves de documento qualificadas do serviço Index
-
Envia as chaves do documento para o Data Service (uma "solicitação de busca")
-
Obtém os documentos de volta do Data Service
-
Avalia os documentos (reaplica os critérios de filtragem etc.)
-
Envia os resultados finais filtrados de volta ao cliente
Em um aplicativo bem projetado, as etapas 5 e 6 podem ser evitadas usando um índice de cobertura (que recomendamos como prática recomendada), o que pode resultar em uma melhoria de desempenho demonstrável.
A instrução EXPLAIN no N1QL permite que você veja o plano de execução da consulta. Quando um índice de cobertura é usado para a execução da consulta, o EXPLAIN agora mostrará que um índice de cobertura é usado para acesso aos dados (e as buscas de documentos de valor-chave e a sobrecarga associada são evitadas).
Digamos que criemos um índice sobre o atributo "state" (estado) no bucket de amostras de cerveja.
CREATE INDEX idxstate ON amostra de cerveja
(estado) USANDO GSI
Agora, se selecionarmos o estado de beer-sample, como todos os dados a serem retornados estão presentes no índice, poderemos evitar a busca de dados de valor-chave e apenas retornar os dados com base no índice.
EXPLAIN SELECT state FROM beer-sample' WHERE state = "CA"
"results": [
{
"#operator": "Sequence",
"~children": [
{
"#operator": "IndexScan",
"covers": [
"cover((amostra de cerveja.
estado))"
],
"index": "idxstate",
"Espaço-chave": "beer-sample",
"namespace": "default",
"spans": [
{
"Range": {
"Alto": [
""CA""
],
"Inclusão": 3,
"Low": [
""CA""
]
}
}
],
"using": "gsi"
Observação: O mesmo índice NÃO é um índice de cobertura se a consulta for ligeiramente modificada.
EXPLAIN SELECT estado, cidade FROM amostra de cerveja ONDE STATE = "CA";
Ele ainda usa o índice idxstate, porém, como o índice NÃO contém as informações da cidade, ele usa o índice para uma pesquisa mais rápida, mas não como um índice de cobertura.
{
"requestID": "c60b10d2-2cab-4b6a-987c-e5e6ebe4a900",
"signature" (assinatura): "json",
"results": [
{
"#operator": "Sequence",
"~children": [
{
"#operator": "IndexScan",
"index": "idxstate",
"Espaço-chave": "beer-sample",
"namespace": "default",
"spans": [
{
"Range": {
"Alto": [
""CA""
],
"Inclusão": 3,
"Low": [
""CA""
]
}
}
],
"using": "gsi"
},
{
"#operator": "Paralelo",
"~child": {
"#operator": "Sequence",
"~children": [
{
"#operator": "Fetch",
"Espaço-chave": "beer-sample",
"namespace": "default"
},
{
"#operator": "Filter",
"condition": "((amostra de cerveja.
estado) = "CA")"
},
{
"#operator": "InitialProject",
"result_terms": [
{
"expr": "(amostra de cerveja.
estado)"
},
{
"expr": "(amostra de cerveja.
cidade)"
}
]
},
{
"#operator": "FinalProject"
}
]...resto omitido para fins de brevidade
Como podemos então converter essa consulta modificada para usar um índice de cobertura?
Aqui está,
CREATE INDEX idxstatecity ON amostra de cerveja (estado, cidade) USANDO GSI
Agora, se executarmos a consulta:
EXPLAIN SELECT estado, cidade
DE amostra de cerveja USE INDEX (idxstatecity)
WHERE STATE = "CA" ;
Bingo! Ela se torna uma consulta que usa um índice de cobertura
{
"#operator": "IndexScan",
"covers": [
"cover((meta(amostra de cerveja).
id))",
"cover((amostra de cerveja.
estado))",
"cover((amostra de cerveja.
cidade))"
],
"index": "idxstatecity",
"Espaço-chave": "beer-sample",
"namespace": "default",
"spans": [
{
"Range": {
"Alto": [
"successor("CA")"
],
"Inclusão": 1,
"Low": [
""CA""
]
}
}
],
"using": "gsi"
},
EXPRESSÕES E AGREGADOS
As consultas com expressões e agregados também podem se beneficiar do índice de cobertura.
CREATE INDEX idxstatecountry ON amostra de cerveja(estado, país) USANDO GSI
SELECT country, max(state)
DE amostra de cerveja USE INDEX (idxstatecountry)
WHERE STATE LIKE '%'
GROUP BY country
UNIÃO / INTERSEÇÃO / EXCEÇÃO
Também há suporte para esses índices de cobertura
SELECIONAR PAÍS
DE amostra de cerveja
WHERE STATE = 'CA'
UNION ALL
SELECIONAR PAÍS
DE amostra de cerveja
WHERE STATE = 'Texas'
E como o índice já está classificado, quando você usa ORDER BY no caso de um índice de cobertura, há o benefício adicional de o mecanismo de consulta já poder usar um índice classificado.
Consulte nosso documentação para obter mais informações e outros cenários em que os índices de cobertura serão úteis para você.
Recomendamos enfaticamente que você experimente esse recurso na visualização para desenvolvedores da versão 4.1 e nos dê seu valioso feedback. feedback.
Você também pode experimentar o N1QL usando o Developer Preview do Workbench de consultaque fornece uma boa GUI para escrever e executar consultas N1QL.