Cuando se habilita la separación de lectura y escritura, crear tablas temporales y ejecutar instrucciones del lenguaje de manipulación de datos (DML) en el nodo primario aumenta su carga de trabajo. PolarDB for MySQL le permite crear y consultar tablas temporales directamente en los nodos de solo lectura. De esta manera, el nodo primario queda libre para las operaciones intensivas de escritura. Para obtener una descripción general de los nodos de solo lectura, consulte Global read-only node.
Cómo funciona
Las tablas temporales almacenan resultados intermedios de consultas dentro de una sesión. Esto reduce los escaneos repetitivos de datos y mantiene los datos aislados entre sesiones simultáneas. Cuando la sesión termina, la tabla y sus datos se eliminan automáticamente.
PolarProxy no enruta automáticamente la creación de tablas temporales ni las operaciones DML posteriores al mismo nodo. Por lo tanto, debe incluir un hint de SQL (/*force_node='pi-bpxxxxxxxx'*/) en cada instrucción que interactúe con la tabla temporal. Sin este hint, la instrucción se enruta al nodo primario y cualquier instrucción posterior en un nodo distinto falla con el siguiente mensaje:
Table 'test.new_tbl' doesn't exist
Versiones compatibles
Su clúster debe ejecutar una de a continuación versiones:
PolarDB for MySQL 5.7, versión de revisión 5.7.1.0.35 o posterior
PolarDB for MySQL 8.0.1, versión de revisión 8.0.1.1.28 o posterior
PolarDB for MySQL 8.0.2, versión de revisión 8.0.2.2.5 o posterior
Limitaciones
|
Restricción |
Detalle |
|
Motores compatibles en nodos de solo lectura |
Solo MEMORY o MyISAM; InnoDB no es compatible. |
|
Motores compatibles en el nodo primario |
MEMORY o InnoDB |
|
Ciclo de vida de la tabla |
Nivel de sesión: la tabla y sus datos se eliminan automáticamente cuando la sesión termina. |
|
Enrutamiento |
PolarProxy no fija una sesión a un nodo específico. Incluya el hint |
Requisitos previos
Antes de empezar, compruebe que cuenta con lo siguiente:
Un nodo de solo lectura en su clúster. Para agregar uno, consulte Add or remove read-only nodes
Una conexión al clúster. Consulte Conectarse a un clúster
Crear una tabla temporal en un nodo de solo lectura
Incluya el hint /*force_node='pi-bpxxxxxxxx'*/ en cada instrucción que cree o acceda a la tabla temporal. Reemplace pi-bpxxxxxxxx con el identificador de su nodo de solo lectura.
-- 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 comprobar que la tabla temporal es accesible desde el nodo de solo lectura, conéctese al endpoint del clúster y ejecute a continuación consultas:
mysql -u <user> -h test-4.xxx.polardb.aliyuncs.com -P3306 -p<pwd>
SELECT * FROM new_tbl;
Salida esperada:
+----+-------------+
| c1 | c2 |
+----+-------------+
| 1 | test_string |
+----+-------------+
1 row in set (0.07 sec)
SHOW CREATE TABLE new_tbl;
Salida 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)
Crear tablas temporales mediante procedimientos almacenados (recomendado)
Para operaciones por lotes, utilice un procedimiento almacenado. Esta práctica centraliza toda la lógica de la tabla temporal en una sola unidad invocable y reduce la cantidad de instrucciones con hints en el código de su aplicación.
-
Cree el procedimiento almacenado mediante el endpoint del clúster o el nodo primario.
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 ; -
Ejecute el procedimiento almacenado en el nodo de solo lectura de destino.
/*force_node='pi-bpxxxxxxxx'*/ call tmp_p0();
Temas relacionados
HINT syntax: referencia completa sobre los hints de enrutamiento en PolarDB for MySQL
Nodo global de solo lectura: descripción general de la arquitectura de nodos de solo lectura