Todos os produtos
Search
Central de documentação

AnalyticDB:Cache de paginação (otimização de desempenho para consultas paginadas profundas)

Última atualização: Jun 27, 2026

AnalyticDB for MySQL oferece um mecanismo de cache que acelera consultas paginadas em grande escala com as cláusulas LIMIT, OFFSET e ORDER BY, resolvendo a degradação de desempenho causada pela paginação profunda. Este tópico descreve como usar o recurso de cache de paginação para otimizar o desempenho de consultas paginadas e apresenta uma abordagem alternativa de paginação por conjunto de chaves.

Pré-requisitos

Crie um cluster do AnalyticDB for MySQL versão V3.2.3 ou posterior.

Nota

Visão geral

Problemas de desempenho causados por consultas paginadas profundas

Usuários de plataformas de e-commerce frequentemente desejam ordenar produtos com base no volume de vendas ou em pontuações abrangentes para priorizar itens de qualidade. Na maioria dos casos, as aplicações exibem resultados usando paginação para acelerar a resposta da página e evitar problemas de desempenho decorrentes do carregamento de grandes volumes de dados simultaneamente.

Um método comum em bancos de dados consiste em ordenar os dados com base em uma coluna e executar consultas paginadas usando as cláusulas LIMIT e OFFSET. A cláusula LIMIT define a quantidade de entradas exibidas por página, enquanto a cláusula OFFSET especifica o deslocamento inicial dos dados em cada página. Por exemplo, para exibir 100 entradas por página e consultar os dados da primeira página, execute: SELECT * FROM t_order ORDER BY id LIMIT 0, 100. Para consultar os dados da página 10.001, execute: SELECT * FROM t_order ORDER BY id LIMIT 1000000, 100.

Ao executar consultas paginadas sobre grandes volumes de dados, uma consulta paginada profunda pode degradar significativamente o desempenho do banco de dados devido à sobrecarga de ordenação global e operações frequentes de busca. Esse problema é ainda mais complexo no AnalyticDB for MySQL. Para reduzir a transferência de dados entre nós, cada nó de armazenamento executa um cálculo topN e o nó Gather agrega os resultados de todos os nós de armazenamento para obter o conjunto de resultados final.

image

Para garantir a correção do conjunto de resultados final, o sistema deve atribuir as instruções SQL reescritas a cada nó de armazenamento para execução. Por exemplo, ao consultar as entradas da página 10.001, cada nó de armazenamento recebe a seguinte instrução SQL: SELECT * FROM t_order ORDER BY id LIMIT 0, 1000100. Consequentemente, o nó Gather precisa ordenar 1.000.100 × Número de nós de armazenamento entradas para obter apenas 100.

A quantidade de dados ordenados aumenta linearmente com a profundidade da paginação, causando queda abrupta no desempenho. Isso impõe carga significativa sobre memória e CPU, aumentando o risco de erros de falta de memória (OOM). Esse é o problema de desempenho causado por consultas paginadas profundas.

Importante

Nos clusters da Enterprise Edition do AnalyticDB for MySQL, os dados são distribuídos por vários nós de armazenamento. Consultas paginadas exigem transferência de dados entre nós e ordenação global, o que amplifica a sobrecarga de desempenho da paginação profunda em comparação com bancos de dados de nó único. Os clusters da Basic Edition do AnalyticDB for MySQL utilizam arquitetura de nó único. Problemas de paginação profunda na Basic Edition assemelham-se aos encontrados em bancos de dados convencionais de nó único.

Para resolver problemas de desempenho em consultas paginadas profundas, o AnalyticDB for MySQL disponibiliza o recurso de cache de paginação. Na primeira execução de uma consulta paginada, o sistema busca os dados no banco de dados e armazena os resultados em uma tabela de cache temporária. Consultas subsequentes com o mesmo padrão SQL leem os dados diretamente dessa tabela temporária, evitando repetições de ordenação. Isso resolve efetivamente o problema de desempenho de consultas paginadas profundas e previne erros de OOM causados pela cláusula ORDER BY. O AnalyticDB for MySQL limpa automaticamente os dados em cache desnecessários, seguindo uma política de evicção para garantir a utilização adequada dos recursos.

O recurso de cache de paginação adequa-se aos seguintes cenários:

  • Exportação de grandes volumes de dados

    Durante a exportação de grandes quantidades de dados, o cliente pode apresentar instabilidade. Nesses casos, o sistema realiza consultas paginadas para buscar resultados em lotes. Se você utilizar as cláusulas LIMIT e OFFSET, o ambiente distribuído não garante o processamento dos dados em ordem específica. Cada consulta sobre os dados da mesma página pode retornar resultados diferentes. Portanto, use a cláusula ORDER BY para evitar dados duplicados ou ausentes. O recurso de cache de paginação permite eliminar a cláusula ORDER BY desnecessária, melhorando significativamente o desempenho da consulta e reduzindo o risco de erros de OOM.

  • Consulta paginada de dados completos

    Os resultados completos da consulta ficam armazenados em cache no espaço de armazenamento quente do AnalyticDB for MySQL. Isso garante a disponibilidade dos dados e aumenta consideravelmente a velocidade da consulta. Utilize o recurso de cache de paginação para obter e exibir informações por páginas.

  • Controle de concorrência para relatórios de negócios

    Múltiplas consultas iniciadas simultaneamente no mesmo relatório aumentam a carga de trabalho no cluster e podem resultar em inconsistência de dados. Use o recurso de cache de paginação para executar uma única consulta dentro de uma janela de tempo, melhorando o desempenho da consulta e a estabilidade do cluster.

Uso

Configure um banco de dados de cache

Antes de usar o recurso de cache de paginação, especifique um banco de dados para armazenar as tabelas de cache temporárias das consultas paginadas. Caso nenhum banco de dados seja especificado, as tabelas de cache temporárias serão armazenadas no banco de dados interno conectado. Ao ativar o recurso de cache de paginação, o sistema cria automaticamente uma tabela de cache temporária.

Nota

Não é possível especificar um banco de dados externo como banco de dados de cache.

Por exemplo, defina o banco de dados paging_cache como banco de dados de cache. Outros bancos de dados também podem ser especificados.

SET ADB_CONFIG PAGING_CACHE_SCHEMA=paging_cache;

Ative o recurso de cache de paginação para consultas paginadas

Quando várias consultas paginadas compartilham o mesmo padrão SQL, adicione uma dica às instruções SQL para melhorar o desempenho. Na primeira execução de uma consulta paginada contendo uma dica, o sistema cria uma tabela de cache temporária para armazenar os resultados. Nas consultas subsequentes com o mesmo padrão SQL, adicione a mesma dica às instruções. Assim, o sistema lê os dados da tabela de cache temporária sem acessar o banco de dados repetidamente.

Limites

Após eliminar as cláusulas LIMIT e OFFSET, o número de entradas de dados para consultas paginadas deve ser inferior a 100 milhões.

Nota

Se o número de entradas de dados a serem consultadas exceder 100 milhões, Envie um ticket para ajustar o limite superior do número de entradas de dados.

Métodos para ativar o recurso de cache de paginação

Utilize uma das seguintes dicas para ativar o recurso de cache de paginação:

  • paging_id=<paging_id>

    O parâmetro paging_id especifica a tabela de cache criada para um conjunto de consultas paginadas que compartilham o mesmo padrão SQL, mas possuem valores diferentes nas cláusulas LIMIT e OFFSET. O cliente deve gerar um ID exclusivo para identificar unicamente uma tabela de cache para esse conjunto de consultas.

    • Se o parâmetro paging_id especificado não existir, o sistema criará uma tabela de cache.

    • Caso o parâmetro paging_id consultado exista e o padrão SQL envolvido na consulta corresponda ao padrão associado a esse paging_id, a consulta atingirá o cache.

    • Se o parâmetro paging_id consultado existir, mas o padrão SQL da consulta não corresponder ao padrão associado ao paging_id, ocorrerá um erro. Verifique se o parâmetro paging_id já está em uso. Para mais informações, consulte a seção "Consultar informações sobre tabelas de cache" deste tópico.

    Nota

    O parâmetro paging_id deve seguir as convenções de nomenclatura: o nome deve ter entre 1 e 127 caracteres, podendo conter letras, dígitos e sublinhados (_). Deve começar com letra ou sublinhado (_). Não são permitidas aspas simples ('), aspas duplas ("), pontos de exclamação (!) ou espaços. O nome não pode ser uma palavra reservada SQL.

    Por exemplo, defina o ID de paginação como paging123 para o resultado de um conjunto de consultas paginadas que utilizam o recurso de cache de paginação.

    /*paging_id=paging123*/ SELECT * FROM t_order ORDER BY id LIMIT 0, 100;
  • paging_cache_enabled=true

    Este método não exige modificações frequentes nas dicas. O servidor utiliza o padrão SQL (sem as cláusulas LIMIT e OFFSET) para gerar um ID de paginação que identifica o conjunto de consultas.

    A dependência da correspondência de padrões SQL limita a flexibilidade deste método. Se não houver tabela de cache para consultas paginadas que compartilhem o mesmo padrão SQL (excluindo LIMIT e OFFSET), o sistema criará uma nova tabela. Caso já exista uma tabela de cache para esse padrão, ela será utilizada para consultar os dados.

    Instrução de exemplo:

    /*paging_cache_enabled=true*/ SELECT * FROM t_order ORDER BY id LIMIT 0, 100;

Se a criação da tabela de cache falhar, limpe os dados de cache das consultas paginadas e inicie novamente uma consulta paginada para criar a tabela.

Consultar informações sobre tabelas de cache

Consulte informações sobre todas as tabelas de cache de consultas paginadas no cluster atual, incluindo ID de paginação, tamanho do cache e status do cache.

SELECT * FROM INFORMATION_SCHEMA.KEPLER_PAGING_CACHE_STATUS_MERGED;

Especifique o número máximo de tabelas de cache

Defina o número máximo de tabelas de cache permitidas no cluster atual. Valor padrão: 32.

SET ADB_CONFIG PAGING_CACHE_MAX_TABLE_COUNT=32;

Se você tentar criar uma tabela de cache quando o total de tabelas exceder o limite, ocorrerá um erro. Mensagem de erro de exemplo:

Paging cache count exceeds the limit. Please clean up unused caches or increase the related parameter using SET ADB_CONFIG PAGING_CACHE_MAX_TABLE_COUNT=xxx.

Limpe os dados de cache desnecessários ou aumente o número máximo de tabelas de cache conforme indicado na mensagem de erro.

Especifique um período de validade para uma tabela de cache

Configure um período de validade para a tabela de cache, em segundos. Após o término desse período, a tabela torna-se inválida. Quando consultas paginadas subsequentes compartilharem o mesmo padrão SQL, o sistema acessará o banco de dados e atualizará a tabela de cache. Geralmente, esse recurso é utilizado em cenários de controle de concorrência de relatórios.

Por exemplo, utilize a dica /*paging_cache_enabled=true, paging_cache_validity_interval=300*/ para manter a tabela de cache válida por 300 segundos após a criação. Instrução de exemplo:

/*paging_cache_enabled=true, paging_cache_validity_interval=300*/ SELECT * FROM t_order ORDER BY id LIMIT 0, 100;

Limpar os dados de cache de consultas paginadas

Ao utilizar o recurso de cache de paginação, os resultados das consultas são armazenados no espaço de armazenamento quente do AnalyticDB for MySQL. Se determinados dados em cache não forem mais necessários, limpe-os para liberar espaço de armazenamento.

Limpeza manual

  • Dados de cache de consultas paginadas especificados por padrão SQL

    Utilize a dica /*paging_cache_enabled=true, invalidate_paging_cache=true*/ para limpar os dados de cache associados a um padrão SQL específico.

    Instrução de exemplo:

    /*paging_cache_enabled=true,invalidate_paging_cache=true*/ SELECT * FROM t_order ORDER BY id LIMIT 0, 100;
  • Dados de cache de consultas paginadas especificados pelo parâmetro paging_id

    Limpe os dados de cache das consultas paginadas identificadas pelo parâmetro paging_id.

    Instrução de exemplo:

    CLEAN_PAGING_CACHE paging123;
    Nota

    Para obter informações sobre como recuperar o valor do parâmetro paging_id, consulte a seção "Consultar informações sobre tabelas de cache" deste tópico.

Limpeza automática

Defina um tempo de expiração do cache para limpar automaticamente os dados de consultas paginadas não acessados dentro do intervalo especificado. Valor padrão: 3600. Unidade: segundos. Por padrão, dados não acessados em 1 hora são removidos automaticamente.

SET ADB_CONFIG PAGING_CACHE_EXPIRATION_TIME=3600;

Alternativa: Paginação por conjunto de chaves

Se o seu cenário de negócio suportar navegação baseada em cursor (por exemplo, navegar para a próxima página ou página anterior sem pular para uma página arbitrária), utilize a paginação por conjunto de chaves como alternativa à paginação tradicional baseada em OFFSET. Em vez de usar OFFSET para ignorar linhas, a paginação por conjunto de chaves emprega uma cláusula WHERE para filtrar linhas com base no último valor recuperado. Isso evita a sobrecarga de ordenação global e transferência de dados entre nós em páginas profundas.

Por exemplo, suponha que a coluna id seja a chave primária e o último valor de id na página atual seja 1000. Use a seguinte instrução SQL para consultar a próxima página:

-- Traditional deep pagination (slow)
SELECT * FROM t_order ORDER BY id LIMIT 1000, 100;

-- Keyset pagination (fast, recommended)
SELECT * FROM t_order WHERE id > 1000 ORDER BY id LIMIT 100;

O método de paginação por conjunto de chaves recupera apenas o próximo lote de linhas diretamente do índice, sem ordenar ou ignorar um grande número de registros. Isso elimina a degradação de desempenho causada pela paginação profunda, mantendo o desempenho da consulta constante independentemente da profundidade da paginação.

Erros comuns e solução de problemas

Falha na preparação do cache de paginação e cache indisponível

Mensagem de erro:

Paging cache prepare failed, and cache is not available. Please use /*paging_cache_enabled=true,invalidate_paging_cache=true*/ to clean the unavailable cache or set a specific pagingId with /*paging_id=xxx*/ to gen a new cache. Note that the old and new cache data may be inconsistent.

Causa: Ao usar o recurso de cache de paginação para consultar dados, podem ocorrer exceções, como reinicialização ou dimensionamento de nós. Se uma consulta paginada atingir uma tabela de cache cuja criação falhou, o servidor não acessará o banco de dados nem recriará automaticamente a tabela de cache, lançando um erro.

Solução: Para garantir a consistência dos dados, realize as seguintes operações: Em cenários de exportação de dados, recomenda-se limpar os dados exportados e os dados de cache indisponíveis e, em seguida, reiniciar a consulta paginada para recriar a tabela de cache. Em outros cenários, limpe os dados de cache indisponíveis ou especifique um novo valor para o parâmetro paging_id e reinicie a consulta paginada para recriar a tabela de cache.

Comparação de desempenho

Utilizamos um conjunto de dados TPC-H de 100 GB para avaliar o efeito de otimização do recurso de cache de paginação em consultas paginadas durante cenários de exportação de dados.

Este teste envolve a exportação de 1 milhão de entradas, com 100.000 entradas por página. Execute as seguintes instruções para realizar consultas paginadas na primeira página:

-- General paged query without using the paging cache feature
SELECT * FROM lineitem ORDER BY l_orderkey,l_linenumber LIMIT 0,100000;

-- Paged query by using the paging cache feature (ORDER BY eliminated in the data export scenario)
/*paging_cache_enabled=true*/ SELECT * FROM lineitem LIMIT 0,100000;

Resultado do teste:

As solicitações de consulta foram executadas em modo de concorrência única. Durante o processo de exportação de dados, o tempo médio de resposta das consultas paginadas gerais foi de 54.391 ms. Após a ativação do recurso de cache de paginação, o tempo médio de resposta caiu para 525 ms. O desempenho melhorou aproximadamente 103 vezes. A utilização da CPU e o uso de memória diminuíram significativamente.

O recurso de cache de paginação reduz drasticamente o tempo de resposta das consultas paginadas durante a exportação de dados e diminui efetivamente o consumo de recursos de CPU e memória.

image.png