MySQL удаляет дубликаты из большой быстрой базы данных

Существует httpauth.py. Я - все еще полный newb с Django, таким образом, я понятия не имею, как он вписывается точно, но он должен сделать то, что Вы ищете.

Редактирование: вот более длинный поток ошибки на предмете .

69
задан bizzz 31 October 2009 в 08:06
поделиться

4 ответа

Я считаю, что это будет сделано, если использовать дублирующий ключ + ifnull ():

create table tmp like yourtable;

alter table tmp add unique (text1, text2);

insert into tmp select * from yourtable 
    on duplicate key update text3=ifnull(text3, values(text3));

rename table yourtable to deleteme, tmp to yourtable;

drop table deleteme;

Должно быть намного быстрее, чем все, что требует группировки или отдельных, или подзапроса, или даже упорядочения по. Для этого даже не требуется файловая сортировка, которая снижает производительность большой временной таблицы. По-прежнему потребуется полное сканирование исходной таблицы, но этого нельзя избежать.

146
ответ дан 24 November 2019 в 13:35
поделиться
DELETE FROM dups
WHERE id NOT IN(
    SELECT id FROM (
        SELECT DISTINCT id, text1, text2
            FROM dups
        GROUP BY text1, text2
        ORDER BY text3 DESC
    ) as tmp
)

Это запрашивает все записи, группы по полям различения и заказы по ID (означает, что мы выбираем первую непустую запись text3). Затем мы выбираем идентификаторы из этого результата (это хорошие идентификаторы ... они не будут удалены) и удаляем все идентификаторы, которые их НЕ ДЕЛАЮТ.

Любой подобный запрос, затрагивающий всю таблицу, будет медленным. Вам просто нужно запустить его и позволить развернуться, чтобы вы могли предотвратить это в будущем.

После того, как вы сделаете это «исправление», я бы применил UNIQUE INDEX (text1, text2) к этой таблице. Чтобы предотвратить возможность дублирования в будущем.

Если вы хотите пойти по маршруту «создать новую таблицу и заменить старую». Вы можете использовать очень внутренний оператор select для создания вашего оператора вставки.

Для MySQL (предполагается, что новая таблица называется my_tbl2 и имеет точно такую ​​же структуру):

12
ответ дан 24 November 2019 в 13:35
поделиться

У меня нет большого опыта работы с MySQL. Если в нем есть аналитические функции, попробуйте:

delete from my_tbl
 where id in (
     select id 
       from (select id, row_number()
                            over (partition by text1, text2 order by text3 desc) as rn
               from my_tbl
               /* optional: where text1 like 'a%'  */
             ) as t2
       where rn > 1
     )

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

0
ответ дан 24 November 2019 в 13:35
поделиться

Если вы можете создать новую таблицу, сделайте это с помощью уникального ключа в полях text1 + text2. Затем вставьте в таблицу, игнорируя ошибки (используя синтаксис INSERT IGNORE):

select * from my_tbl order by text3 desc
  • Я думаю, что порядок по text3 desc поместит NULL последними, но дважды проверьте это.

Индексы для всех этих столбцов могут очень помочь, но создание их сейчас может быть довольно медленным.

3
ответ дан 24 November 2019 в 13:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: