Я собираю показания с нескольких тысяч датчиков и сохраняю их в базе данных MySQL. Есть несколько сотен вставок в секунду. Чтобы улучшить производительность вставки, я сначала сохраняю значения в буферной таблице MEMORY. Раз в минуту я запускаю хранимую процедуру, которая перемещает вставленные строки из буфера памяти в постоянную таблицу.
В основном я хотел бы сделать следующее в моей хранимой процедуре, чтобы переместить строки из временного буфера:
INSERT INTO data SELECT * FROM data_buffer;
DELETE FROM data_buffer;
К сожалению, предыдущий вариант неприменим, потому что процессы сбора данных вставляют дополнительные строки в «data_buffer» между INSERT и DELETE выше. Таким образом, эти строки будут удалены без вставки в таблицу «данные».
Как я могу сделать операцию атомарной или сделать оператор DELETE для удаления только тех строк, которые были выбраны и вставлены в предыдущем операторе?
Я бы предпочел сделать это стандартным способом, который, если возможно, работает на разных механизмах баз данных.
Я бы предпочел не добавлять какие-либо дополнительные столбцы «id» из-за накладных расходов на производительность и требований к хранилищу.
Я бы хотел, чтобы в стандартном SQL был оператор SELECT_AND_DELETE или MOVE или что-то подобное...
data_buffer
(time
int(11) NOT NULL,sensor
smallint(6) NOT NULL,value
float NOT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1; - person snap   schedule 03.08.2011