Самый быстрый способ удалить огромную таблицу MySQL

Могут быть построены довольно простые примеры , которые напрямую связаны с деструкторами, а не с самоанализом статуса noexcept:

void a(int);
void b() noexcept;
void c(int i) {
  struct A {
    int i;
    ~A() {a(i);}
  } a={i};
  b();
  a.i=1;
}

Здесь noexcept позволяет инициализировать a в вызывающего абонента следует игнорировать, поскольку деструктор не может его наблюдать.

struct B {~B();};
void f();
void g() noexcept {
  B b1;
  f();
  B b2;
}

Здесь noexcept позволяет пропускать информацию кадра, необходимую в случае, если вызываемый абонент выбрасывает. Это зависит от (очень распространенного) решения не раскручивать стек при вызове std::terminate.

52
задан Brian Tompsett - 汤莱恩 24 September 2016 в 12:52
поделиться

9 ответов

Самый быстрый способ - использовать DROP TABLE, чтобы полностью удалить таблицу и воссоздать ее, используя то же определение. Если у вас нет ограничений внешнего ключа для таблицы, вы должны это сделать.

Если вы используете версию MySQL выше 5.0.3, это произойдет автоматически с TRUNCATE. Вы также можете получить некоторую полезную информацию из руководства, оно описывает, как TRUNCATE работает с ограничениями FK. http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html

РЕДАКТИРОВАТЬ: TRUNCATE - это не то же самое, что отбрасывание или УДАЛЕНИЕ ИЗ. Для тех, кто не понимает различий, пожалуйста, проверьте ссылку руководства выше. TRUNCATE будет действовать так же, как отбрасывание, если может (если нет FK), в противном случае он будет действовать как DELETE FROM без предложения where.

48
ответ дан 7 November 2019 в 08:58
поделиться

Не могли бы вы взять схему, отбросить таблицу и воссоздать ее?

7
ответ дан 7 November 2019 в 08:58
поделиться

drop table должен быть самым быстрым способом избавиться от него.

3
ответ дан 7 November 2019 в 08:58
поделиться

Если вы просто хотите полностью избавиться от таблицы, почему бы просто не удалить ее?

1
ответ дан 7 November 2019 в 08:58
поделиться

Вы пробовали использовать "drop"? Я использовал его для таблиц размером более 20 ГБ, и он всегда завершается за секунды.

1
ответ дан 7 November 2019 в 08:58
поделиться

Лучший способ, который я нашел для этого с MySQL, - это:

DELETE from table_name LIMIT 1000;

Или 10 000 (в зависимости от того, насколько быстро это происходит).

Поместите это в цикл, пока не будут удалены все строки .

Пожалуйста, попробуйте это, так как это действительно сработает. Это займет некоторое время, но это сработает.

7
ответ дан 7 November 2019 в 08:58
поделиться

Усечение выполняется быстро, обычно порядка секунд или меньше. Если это заняло 30 минут, у вас, вероятно, был случай, когда некоторые внешние ключи ссылались на таблицу, которую вы усекали. Также могут возникнуть проблемы с блокировкой.

Усечение так же эффективно, как и очистка таблицы,

1
ответ дан 7 November 2019 в 08:58
поделиться

У нас было эти вопросы. Мы больше не используем базу данных в качестве хранилища сеансов с Rails 2.x и хранилищем файлов cookie. Однако сбросить стол - достойное решение. Вы можете подумать об остановке службы mysql, временно отключить ведение журнала, запустить что-то в безопасном режиме, а затем выполнить drop / create. Когда закончите, снова включите ведение журнала.

0
ответ дан 7 November 2019 в 08:58
поделиться

Не понимаю, почему это занимает так много времени. Но, возможно, попробуйте переименовать и воссоздать пустую таблицу. Тогда вы можете отказаться от «лишней» таблицы, не беспокоясь о том, сколько времени это займет.

0
ответ дан 7 November 2019 в 08:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: