У меня есть дюжина таблиц, которые очищаются с помощью таблицы TRUNCATE каждые 10-20 секунд или около того, когда мой php-скрипт запускается в оболочке с локальной машины XAMPP.
По неизвестной причине каждые пару часов случайная таблица исчезает, и в результате мой скрипт останавливается. В скрипте нет запросов, которые бы удаляли / удаляли таблицу
Что интересно, таблица удаляется в главном окне, но я все еще вижу ее на боковой панели слева.
Когда я пытаюсь воссоздать удаленную таблицу, я получаю ошибку mysql «нет такой таблицы». Мне удалось воссоздать его, скопировав файл таблицы .frm из идентичной таблицы, и это позволило бы мне удалить старый файл через sql и заново создать его.
Кто-нибудь сталкивался с таким поведением или знает объяснение? Это сводило меня с ума в течение последних нескольких дней …
Может быть, вы должны рассмотреть вопрос об использовании truncate
для такого рода операций. Цитировать из справочник:
Логически,
TRUNCATE TABLE
похож наDELETE
оператор, который удаляет все строки или последовательностьDROP TABLE
а такжеCREATE TABLE
заявления. Для достижения высокой производительности он обходит DML-метод удаления данных. […] ХотяTRUNCATE TABLE
похож наDELETE
, это классифицируется как Заявление DDL а не заявление DML. Он отличается от DELETE в MySQL 5.5 следующим образом:
- Усеченные операции бросить и воссоздать таблица, которая намного быстрее, чем удаление строк одна за другой, особенно для больших таблиц.
Это может быть хорошо для не частых операций. Но вы усекаете таблицы каждые 10-20 секунд! Я не знаю, работает ли ваш скрипт непрерывно, но если это так, всегда есть вероятность, что часть вашей программы пытается вставить строку в только что усеченную таблицу (которая, возможно, не была полностью перестроена). В моей голове (и в моей интуиции) есть много вещей, которые говорят мне, что не стоит так часто урезать таблицы.
С другой стороны … С какой стати вам нужно обрезать таблицы каждые 20 секунд !? Я могу только рекомендовать вам избегать этого … создавать разделы, индексировать таблицы, обрезать таблицы, когда вы уверены, что никакой другой процесс не пытается их использовать … Использовать DELETE
вместо TRUNCATE
… TRUNCATE
предназначен для задач технического обслуживания, а не для повседневной эксплуатации (это мое мнение).
Других решений пока нет …