Quando a separação de leitura/gravação está ativada, criar tabelas temporárias e executar instruções DML (Data Manipulation Language) no nó primário aumenta a sua carga de trabalho. O PolarDB for MySQL permite criar e consultar tabelas temporárias em nós somente leitura, liberando o nó primário para operações intensivas de gravação. Para uma visão geral dos nós somente leitura, consulte Nó somente leitura global.
Como funciona
As tabelas temporárias armazenam resultados de consulta intermediários dentro de uma sessão, reduzindo varreduras de dados repetitivas e mantendo os dados isolados entre sessões concorrentes. Ao encerrar a sessão, a tabela e seus dados são removidos automaticamente.
Como o PolarProxy não roteia automaticamente a criação de tabelas temporárias e as operações DML subsequentes para o mesmo nó, você deve incluir uma dica SQL (/*force_node='pi-bpxxxxxxxx'*/) em cada instrução que acessa a tabela temporária. Sem a dica, a instrução segue para o nó primário, e qualquer instrução subsequente em um nó diferente falha com:
Table 'test.new_tbl' doesn't existVersões suportadas
O cluster deve executar uma das seguintes versões:
PolarDB for MySQL 5.7, versão de revisão 5.7.1.0.35 ou posterior
PolarDB for MySQL 8.0.1, versão de revisão 8.0.1.1.28 ou posterior
PolarDB for MySQL 8.0.2, versão de revisão 8.0.2.2.5 ou posterior
Limitações
| Restrição | Detalhe |
|---|---|
| Mecanismos suportados nos nós somente leitura | Apenas MEMORY ou MyISAM — InnoDB não é suportado. |
| Mecanismos suportados no nó primário | MEMORY ou InnoDB |
| Ciclo de vida da tabela | Nível de sessão: a tabela e seus dados são removidos automaticamente ao encerrar a sessão |
| Roteamento | O PolarProxy não vincula uma sessão a um nó — inclua a dica /*force_node='...'*/ em cada instrução que cria ou acessa a tabela temporária |
Pré-requisitos
Antes de começar, verifique se você tem:
Um nó somente leitura no cluster. Para adicionar um, consulte Adicionar ou remover nós somente leitura
Uma conexão com o cluster. Consulte Conectar-se a um cluster
Criar uma tabela temporária em um nó somente leitura
Inclua a dica /*force_node='pi-bpxxxxxxxx'*/ em cada instrução que cria ou acessa a tabela temporária. Substitua pi-bpxxxxxxxx pelo ID do nó somente leitura.
-- Create using MEMORY engine
/*force_node='pi-bpxxxxxxxx'*/ CREATE TEMPORARY TABLE new_tbl (c1 int PRIMARY KEY, c2 varchar(100)) ENGINE=MEMORY;
-- Create using MyISAM engine
/*force_node='pi-bpxxxxxxxx'*/ CREATE TEMPORARY TABLE new_tbl (c1 int PRIMARY KEY, c2 varchar(100)) ENGINE=MYISAM;
-- Create from an existing table (copies structure only)
/*force_node='pi-bpxxxxxxxx'*/ CREATE TEMPORARY TABLE new_tbl SELECT * FROM orig_tbl LIMIT 0;
-- Insert data
/*force_node='pi-bpxxxxxxxx'*/ INSERT INTO new_tbl VALUES(1, 'test_string');
-- Query
/*force_node='pi-bpxxxxxxxx'*/ SELECT * FROM new_tbl;Para verificar se a tabela temporária está acessível no nó somente leitura, conecte-se ao endpoint do cluster e execute as seguintes consultas:
mysql -u <user> -h test-4.xxx.polardb.aliyuncs.com -P3306 -p<pwd>SELECT * FROM new_tbl;Saída esperada:
+----+-------------+
| c1 | c2 |
+----+-------------+
| 1 | test_string |
+----+-------------+
1 row in set (0.07 sec)SHOW CREATE TABLE new_tbl;Saída esperada:
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| new_tbl | CREATE TEMPORARY TABLE `new_tbl` (
`c1` int(11) NOT NULL,
`c2` varchar(100) DEFAULT NULL,
PRIMARY KEY (`c1`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.08 sec)Criar tabelas temporárias usando stored procedures (recomendado)
Para operações em lote, use uma stored procedure. Isso concentra toda a lógica de tabela temporária em uma unidade chamável e reduz a quantidade de instruções com dicas no código da aplicação.
Crie a stored procedure usando o endpoint do cluster ou o nó primário.
CREATE TABLE t1 (c1 int PRIMARY KEY, c2 varchar(100)); INSERT INTO t1 VALUES(1, 'test_string'); DELIMITER //; CREATE PROCEDURE tmp_p0() BEGIN CREATE TEMPORARY TABLE IF NOT EXISTS tmp_table engine = MYISAM AS SELECT * FROM t1 limit 10; SELECT * FROM tmp_table; DROP TABLE tmp_table; END //; DELIMITER ;Execute a stored procedure no nó somente leitura de destino.
/*force_node='pi-bpxxxxxxxx'*/ call tmp_p0();
Tópicos relacionados
Sintaxe HINT — referência completa para dicas de roteamento no PolarDB for MySQL
Nó somente leitura global — visão geral da arquitetura de nós somente leitura