ПОЧЕМУ УДАЛЕНИЕ занимает намного больше времени, чем ВЫБОР (но тот же УДАЛЕНО на основе первичного ключа выполняется быстро)

0

Я хотел бы знать, почему мой DELETE в таблице MySQL myisam MySQL 5.5 медленнее (мне пришлось отменить его)

Этот SQL занимает менее секунды:

SELECT id FROM backup
WHERE id > 0 
      AND userId NOT IN 
      (SELECT id FROM user WHERE state > 0) 
ORDER BY id ASC LIMIT 100; 

Этот идентичный DELETE не завершился за 2 минуты (я отменил его)

DELETE FROM backup
WHERE id > 0 
      AND userId NOT IN 
      (SELECT id FROM user WHERE state > 0) 
ORDER BY id ASC LIMIT 100; 

Но следующий DELETE - запрос к SAME ROWS (только сейчас выбранный по их первичному ключу напрямую) - занял второе место!

DELETE FROM backup WHERE id IN (12, 33, 34, [... 100 ids...])

EDIT Я также пробовал эту модификацию, используя подзапрос - я смог его после минуты...

DELETE FROM backup WHERE id IN (
    SELECT ID FROM (
        SELECT id FROM backup WHERE id > 0 
        AND userId NOT IN (SELECT id FROM user WHERE state > 0) 
        ORDER BY id ASC LIMIT 100
    ) a 
);

Использование INNER JOIN не работает с DELETE, так как я использую ORDER BY.

Любая идея?

Показать ещё 1 комментарий
Теги:

1 ответ

0

нормально, проблема на самом деле - это подзапрос - соответственно инструкции ORDER BY и LIMIT.

когда я опускаю порядок и ограничиваю и использую следующий запрос, он работает так быстро, как ожидалось (под вторым):

DELETE backup FROM backup 
INNER JOIN user ON user.id = backup.userId
WHERE backup.id > 0 AND backup.id < 276 AND (state = 0 OR state IS NULL);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню