Quando um cluster HTAP do PolarDB for MySQL atende simultaneamente cargas de trabalho OLTP e OLAP, a mistura desses dois tipos de tráfego no mesmo endpoint de cluster pode fazer com que consultas de armazenamento em linha compitam por recursos com consultas analíticas. Para isolar o tráfego, configure endpoints de cluster separados — um direcionado aos nós de armazenamento em linha para OLTP e outro aos nós de armazenamento em coluna para OLAP — e direcione cada aplicação para seu respectivo endpoint.
Funcionamento do roteamento
O PolarDB roteia requisições em três camadas. Compreender essa ordem ajuda a decidir onde intervir quando o roteamento não ocorre conforme o esperado.
|
Camada |
Mecanismo |
Escopo |
|
1. Endpoint de cluster |
Restringe quais nós um endpoint pode alcançar |
Nível de conexão |
|
2. Otimização baseada em custo |
Selecione um plano de execução de armazenamento em linha ou em coluna com base no custo estimado |
Nível de instrução (automático) |
|
3. SQL hint |
Força um plano de execução específico, substituindo a otimização baseada em custo |
Nível de instrução (manual) |
Em condições normais, a camada 1 separa o tráfego OLTP do OLAP, enquanto a camada 2 cuida da seleção de planos automaticamente. Utilize a camada 3 apenas quando a seleção automática gerar resultados inesperados para uma instrução específica.
As regras padrão de roteamento são:
Requisições de escrita OLTP: sempre roteadas para o nó primário.
Requisições de leitura OLTP: roteadas para nós de armazenamento em linha somente leitura ou para o nó primário.
Requisições de leitura OLAP: roteadas para nós de armazenamento em coluna somente leitura.

Configure endpoints de cluster
Configure dois endpoints de cluster: um para tráfego OLTP e outro para tráfego OLAP. Para obter instruções sobre como criar e gerencie endpoints de cluster, consulte Gerenciar os endpoints de um cluster.
Endpoint OLTP
Escolha um dos seguintes modos:
|
Modo |
Configuração de nós |
|
Read-only |
Adicione apenas nós de armazenamento em linha somente leitura à lista de nós selecione. |
|
Read/Write (Automatic Read/Write Splitting) |
Adicione pelo menos um nó de armazenamento em linha somente leitura. Se Primary Node Accepts Read Requests estiver defina como Yes, as requisições de leitura também serão distribuídas para o nó primário. |
No modo Read/Write (Automatic Read/Write Splitting), todas as requisições de escrita vão para o nó primário, independentemente de ele estar na lista de nós selecione.
Endpoint OLAP
Cargas de trabalho OLAP envolvem apenas requisições de leitura. Use o modo Read-only e adicione pelo menos um nó de armazenamento em coluna somente leitura à lista de nós selecione.
Substituir o roteamento com SQL hints
Após uma instrução chegar a um nó de armazenamento em coluna somente leitura, o PolarDB compara o custo estimado de execução com o parâmetro loose_cost_threshold_for_imci para defina o plano de execução. Se o custo exceder o limiar, o PolarDB utiliza o plano de armazenamento em coluna fornecido pelo In-Memory Column Index (IMCI); caso contrário, usa o plano de armazenamento em linha.
Para substituir essa seleção automática em uma instrução específica, adicione um SQL hint. O hint aplica-se somente à instrução anotada e não afeta outras instruções na mesma conexão ou em conexões diferentes.
Para MySQL 5.7.7 e versões anteriores, adicione a opção --comments ao se conectar ao mecanismo de banco de dados. Caso contrário, o cliente remove os hints antes de enviar a instrução. Execute mysql --version para verificar a versão do seu cliente.
Forçar um plano de execução de armazenamento em coluna
Adicione /*+ SET_VAR(cost_threshold_for_imci=0) */ para defina o limiar de custo como 0 e forçar o plano de armazenamento em coluna, independentemente do custo estimado real.
/*FORCE_IMCI_NODES*/EXPLAIN SELECT /*+ SET_VAR(cost_threshold_for_imci=0) */ COUNT(*) FROM t1 WHERE t1.a > 1;
Dentro de /*+SET_VAR()*/, omita o prefixo loose_ do nome do parâmetro. Usar loose_cost_threshold_for_imci no hint anula seu efeito; use cost_threshold_for_imci em vez disso.
Forçar um plano de execução de armazenamento em linha
Adicione /*+ SET_VAR(USE_IMCI_ENGINE=OFF) */ para ignorar completamente o mecanismo de armazenamento em coluna.
EXPLAIN SELECT /*+ SET_VAR(USE_IMCI_ENGINE=OFF) */ COUNT(*) FROM t1 WHERE t1.a > 1;