Проблема с удалением огромного количества строк с помощью MariaDB

#php #mysql

#php #mysql

Вопрос:

У меня есть база данных с примерно 280 миллионами строк, и я создал резервные копии всего этого (шаг 1), и теперь я пытаюсь очистить все записи, поскольку они просто не нужны после создания резервной копии.

Я взломал несколько скриптов, таких как:

 $begin=0;
for ($k = 1 ; $k < 280; $k  ){  
    mysqli_query( $conn, "delete from this_table where id between 
    ".$begin."000000 and ".$k."000000");
    $begin  ;
}
  

Я также попытался сократить это до кусков даже по 50 КБ, и это полностью зависает, чего мне здесь не хватает?

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

Комментарии:

1. Вы пытаетесь удалить всю таблицу в БД или только подмножество? Если это все, то усечение таблицы, вероятно, является наиболее эффективным способом. Просто убедитесь, что вы прочитали документы и убедитесь, что ни одно из предостережений не вызовет у вас проблем dev.mysql.com/doc/refman/8.0/en/truncate-table.html

2. Попытка удалить каждую строку, которая в данный момент находится в этой таблице

3. Усечение таблицы сработало отлично и было именно тем, что я искал, спасибо.

Ответ №1:

Для меня это сработало идеально.

 MariaDB [myData]> truncate table browserQueries;
Query OK, 0 rows affected (6.161 sec)
  

Ответ №2:

Удаление большого количества строк происходит медленно в любой базе данных, а в MySQL и MariaDB, даже с InnoDB, удаления, как правило, сериализуются очень плохо.

Если у вас нет внешних ключей, это должно быть безопасно TRUNCATE this_table; , что является мгновенной операцией O (1) и даст вам чистую, пустую таблицу, с оговоркой, что она сбросит значение AUTO_INCREMENT. Вам нужно будет исправить это с помощью ALTER TABLE this_table AUTO_INCREMENT=original_value;

Забегая вперед, самый оптимальный способ приблизиться к этому — почти наверняка использовать разделы. Раздел this_table по диапазону идентификатора с соответствующим большим диапазоном. Как только диапазон будет полностью скопирован и больше не нужен, вы можете ALTER TABLE ... DROP PARTITION ... , что также является операцией O (1) (мгновенной).