Нет данных, если запросы отправляются между TRUNCATE и SELECT INTO.Использование MySQL innoDB - PullRequest
3 голосов
/ 27 марта 2012

При использовании MySQL DB у меня возникают проблемы с хранимой процедурой и таймером событий, которые я создал.Я сделал пустую таблицу, которая заполняется данными из другого через SELECT INTO.Перед заполнением я TRUNCATE текущие данные.Он используется для отслеживания только записей журнала, которые происходят в течение 2 месяцев с текущей даты.

Это превращает таблицу журнала 350k + в примерно 750, что действительно ускоряет запросы отчетов.

Проблема заключается в том, что есликлиент посылает запрос точно между оператором TRUNCATE и оператором SELECT INTO (что с большой вероятностью, учитывая, что EVENT настроен на выполнение каждую 1 минуту), запрос не возвращает строк ...

Я посмотрелв блокирование чтения на столе, пока выполняется эта ПРОЦЕДУРА, но блокировки не допускаются в хранимых процедурах.

Может кто-нибудь придумать обходной путь, который (предпочтительно) не требует переделки?Мне действительно нужно указать правильное направление здесь.

Спасибо, Макс

1 Ответ

3 голосов
/ 27 марта 2012

Я бы предложил альтернативный подход вместо усечения таблицы, а затем выбрать в нее ...

Вместо этого вы можете выбрать новый набор данных в новую таблицу. Затем с помощью одной команды RENAME переименуйте новую таблицу в существующую таблицу, а в существующую таблицу - в какое-нибудь имя резервной копии.

RENAME TABLE existing_table TO backup_table, new_table TO existing_table;

Это единственная атомарная операция ... поэтому клиент не сможет прочитать данные после их очистки, но до их повторного заполнения.

Кроме того, вы можете изменить TRUNCATE на DELETE FROM, а затем заключить его в транзакцию вместе с SELECT INTO:

START TRANSACTION
    DELETE FROM YourTable;
    SELECT INTO YourTable...;
COMMIT
...