При удалении строк 40 КБ ожидайте, что это займет время. Основная стоимость (при условии адекватной индексации и достойного запроса) - это накладные расходы на транзакционную семантику удаления «atomi c». Это включает в себя создание копии каждой удаляемой строки, на случай, если есть cra sh. Таким образом, InnoDB может вернуть базу данных к тому, что было до появления cra sh.
. При удалении 40% таблицы намного быстрее копировать строки, чтобы сохранить их в другой таблице, а затем выполнить обмен таблицы.
При удалении большого количества строк (независимо от процентного соотношения) лучше делать это порциями. И лучше всего пройтись по таблице на основе PRIMARY KEY
.
. Я обсуждаю оба этих метода, а также другие, в http://mysql.rjweb.org/doc.php/deletebig
Что касается формулировка запроса:
- Зависит от версии; старые версии MySQL плохо работали с некоторыми разновидностями.
NOT IN (SELECT ...)
и NOT EXISTS
имеют тенденцию быть худшими. IN (SELECT ...)
и / или EXISTS
могут быть лучше. - "Multi-table
DELETE
- это еще один вариант. Он работает как JOIN
. - (Итог: вы не сказали, какую версию вы используете; я могу ' не могу предсказать, какая формулировка будет наилучшей.)
- Мой блог избегает дебатов по формулировке.