Невозможно удалить данные, MySQL - PullRequest
0 голосов
/ 06 декабря 2011

У меня большая база данных, содержащая около 40 миллионов строк в 5 таблицах. Мне нужно удалить строки из одной таблицы, для которой столбец имеет значения, которые не существуют во второй таблице.

Я попытался написать запросы для удаления некоторых строк, а также вставить строки, которые я не хочу удалять, в другую таблицу:

DELETE FROM user_followersid WHERE followersIds_generatedId IN (SELECT * FROM generatedfollowers)

CREATE TABLE tempfollowersids as SELECT * FROM user_followersid WHERE followersIds_generatedId IN (SELECT generatedId from followersid WHERE followerId IN (SELECT * FROM topusers));

Это занимает много времени для удалений и каждый раз заканчивается неудачей и сообщает о следующей ошибке:

ERROR 1206 (HY000): The total number of locks exceeds the lock table size

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

Есть идеи, как мне удалить строки?

Ответы [ 2 ]

4 голосов
/ 06 декабря 2011

Вы говорите:

какой столбец имеет значения, которые не существуют во второй таблице

Итак, ваш запрос не должен быть:

DELETE FROM user_followersid 
WHERE followersIds_generatedId NOT IN 
    (SELECT DISTINCT id FROM generatedfollowers)
0 голосов
/ 07 декабря 2011

Ваше IN утверждение:

DELETE FROM user_followersid 
WHERE followersIds_generatedId IN 
      ( SELECT generatedId
        FROM generatedfollowers 
      )

также может быть записано с EXISTS, как:

DELETE FROM user_followersid AS uf
WHERE EXISTS 
      ( SELECT * 
        FROM generatedfollowers AS gf 
        WHERE gf.generatedId = uf.followersIds_generatedId
      )

и с JOIN, как:

DELETE uf 
FROM user_followersid AS uf
  JOIN generatedfollowers AS gf 
    ON gf.generatedId = uf.followersIds_generatedId

Нельзя использовать LIMIT x с третьим оператором (join).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...