Estoy recopilando lecturas de varios miles de sensores y almacenándolos en una base de datos MySQL. Hay varios cientos de insertos por segundo. Para mejorar el rendimiento de inserción, estoy almacenando los valores inicialmente en una tabla de memoria intermedia MEMORY. Una vez por minuto, ejecuto un procedimiento almacenado que mueve las filas insertadas desde el búfer de memoria a una tabla permanente.¿Cómo mover atómicamente las filas de una tabla a otra?
Básicamente me gustaría hacer lo siguiente en mi procedimiento almacenado para mover las filas de la memoria intermedia temporal:
INSERT INTO data SELECT * FROM data_buffer;
DELETE FROM data_buffer;
Por desgracia, la anterior no es utilizable debido a que los procesos de recopilación de datos insertar filas adicionales en "data_buffer" entre INSERTAR y ELIMINAR arriba. Por lo tanto, esas filas se eliminarán sin ser insertadas en la tabla de "datos".
¿Cómo puedo hacer que la operación sea atómica o hacer que la instrucción DELETE elimine solo las filas que fueron SELECCIONADAS e INSERTADAS en la declaración anterior?
Preferiría hacer esto de una manera estándar que funciona en diferentes motores de base de datos si es posible.
Preferiría no agregar ninguna columna "id" adicional debido a los gastos generales de rendimiento y los requisitos de almacenamiento.
Me gustaría que hubiera SELECT_AND_DELETE o la declaración de MOVE en SQL estándar o algo similar ...
¿Podría proporcionar la estructura de la tabla data_buffer? –
Sure: CREATE TABLE 'data_buffer' ( ' int tiempo' (11) NOT NULL, 'sensor' smallint (6) NOT NULL, ' valor' flotar NOT NULL ) ENGINE = memoria predeterminada charset = latin1; – snap
Tengo una solución específica de MySQL, pero parece que no puedo publicarla en la sección de respuestas antes de que hayan transcurrido 8 horas. Realmente odio estos límites en stackoverflow ... – snap