2015-09-15 2 views
2

Я запускаю запрос ниже, чтобы очистить таблицу, но у меня есть статус «Отправка данных» в течение нескольких часов. Это база данных MySQL.SQL-запрос слишком длинный

DELETE TABLE_INIT FROM DEM_annonces_urlproduit TABLE_INIT 
LEFT OUTER JOIN (
        SELECT MIN(id_url) as id, id_ann 
        FROM DEM_annonces_urlproduit 
        GROUP BY id_ann 
       ) AS TABLE_1 
       ON TABLE_INIT.id_url = TABLE_1.id 
WHERE TABLE_1.id IS NULL 

Таблица имеет следующую структуру

id_url | id_ann | url | eaa 

Мой первичный ключ является id_url и таблицы проиндексированы на id_ann.

У меня есть огромное количество идентичных данных, которые я хочу удалить, и установите id_ann в качестве первичного ключа, чтобы исправить мою проблему. В таблице есть 13M строк.

Нужно ли это делать в течение нескольких часов? Каков наилучший способ очистки стола?

Благодаря

+0

Добавить этот показатель 'ALTER TABLE DEM_annonces_urlproduit ADD KEY (id_ann, id_url)' Это позволит подзапросу использовать бесплатный индексный сканер, каждый из которых эффективен. Это займет некоторое время для 13-мильных строк, поэтому будьте терпеливы. – Mihai

+0

Мне всегда нравится видеть прогресс таких «огромных» операций, поэтому я бы, вероятно, включил его в функцию и разделил на части с помощью некоторого механизма ведения журнала. –

ответ

0

Попробуйте оптимизировать ваше заявление:

DELETE FROM DEM_annonces_urlproduit 
WHERE id NOT IN (
     SELECT MIN(id_url) 
     FROM DEM_annonces_urlproduit 
     GROUP BY id_ann 
) 

Когда он не получает гораздо лучше, цикл по выберите

SELECT MIN(id_url) id, id_ann 
    FROM DEM_annonces_urlproduit 
    GROUP BY id_ann 

и удалять только в пределах группы

DELETE FROM DEM_annonces_urlproduit 
WHERE id <> current.id 
AND id_ann = current.id_ann 
Смежные вопросы