Я не думаю, что можно удалить без блокировки. Тем не менее, я не думаю, что блокировка записи, которую вы хотите удалить, является проблемой. Что будет проблемой, так это блокирование других строк.
Я нашел некоторую информацию по этому вопросу здесь: http://dev.mysql.com/doc/refman/5.0/en/innodb-locks-set.html
То, что я хотел бы предложить, это попытаться сделать миллион однорядные удалений. Я думаю, что если вы делаете все это в одной транзакции, производительность не должна сильно задевать. так что вы получите что-то вроде:
START TRANSACTION;
DELETE FROM tab WHERE id = 1;
..
..
DELETE FROM tab WHERE id = x;
COMMIT;
Вы можете создавать необходимые statments делать что-то вроде
SELECT CONCAT('DELETE FROM tab WHERE id = ', id)
FROM tab
WHERE <some intricate condition that selects the set you want to delete>
поэтому преимущество над этим методом вместо делать:
DELETE FROM tab
WHERE <some intricate condition that selects the set you want to delete>
что в первом подходе вы только блокируете запись, которую вы удаляете, тогда как во втором подходе вы рискуете заблокировать другие записи, которые находятся в том же диапазоне, что и строка вы удаляете.
Есть много индексов на этой таблице? –
Укажите столбцы, которые будут обрабатывать условия. Затем выполните удаление, когда трафик на сайт низкий (возможно, @ ночь). – 2010-02-13 14:54:40
см. Также http://stackoverflow.com/questions/23193761/delete-operation-locks-whole-table-in-innodb, который упоминает блокировку зазора – rogerdpack