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.
Para visualize e atualize a versão secundária de um cluster do AnalyticDB for MySQL, faça login no console do AnalyticDB for MySQL e acesse a seção Configuration Information na página Cluster Information.
Para visualize e atualize a versão secundária de um cluster do AnalyticDB for MySQL, faça login no console do AnalyticDB for MySQL e acesse a seção Configuration Information na página Cluster Information.
Visão geral
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:
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.
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.
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_idespecifica a tabela de cache criada para um conjunto de consultas paginadas que compartilham o mesmo padrão SQL, mas possuem valores diferentes nas cláusulasLIMITeOFFSET. O cliente deve gerar um ID exclusivo para identificar unicamente uma tabela de cache para esse conjunto de consultas.Se o parâmetro
paging_idespecificado não existir, o sistema criará uma tabela de cache.Caso o parâmetro
paging_idconsultado exista e o padrão SQL envolvido na consulta corresponda ao padrão associado a essepaging_id, a consulta atingirá o cache.Se o parâmetro
paging_idconsultado existir, mas o padrão SQL da consulta não corresponder ao padrão associado aopaging_id, ocorrerá um erro. Verifique se o parâmetropaging_idjá está em uso. Para mais informações, consulte a seção "Consultar informações sobre tabelas de cache" deste tópico.
NotaO parâmetro
paging_iddeve 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
paging123para 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
LIMITeOFFSET) 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;NotaPara 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.
