Общие > Базы данных
Помагите с запросом
Altaxar:
Есть таблица "ааа" и есть колонка "bbb", мне нужно удалить все повторяющиеся(дублирующиеся) записи по колонке "bbb".
Дело в том что записей очень много, если самым тупым запросом задать то длительность будет большая N*N, подскажите более быстрый запрос.
andymc:
Простой вариант...
--- Код: ---
DELETE *
FROM aaa
WHERE bbb NOT IN
(SELECT DISTINCT bbb
FROM aaa);
--- Конец кода ---
Если надо быстрее, то можно гипотетически предположить
--- Код: ---1. SELECT DISTINCT bbb FROM aaa
2. Заменить таблицу aaa на таблицу созданную по запросу 1)
--- Конец кода ---
Думаем дальше. Наверняка есть поле id (первичный ключ)
--- Код: ---1. SELECT DISTINCT bbb, id FROM aaa
2. SELECT * id FROM aaa
3. array_diff(1,2)
4. Удалить все строки с id из массива 3)
--- Конец кода ---
Ни один из вариантов конечно не оптимален. I tried :(
Altaxar:
--- Цитировать ---andymc
--- Конец цитаты ---
Спасибо.
Думаю ускорит если столбец bbb в MySQL сделать также ключевым. тогда он столбец сделает не как список, а более удобный для поиска и DISTINCT заработает быстрее.
2 вариант неудобен, у меня очень маленький процент повторение(0.1 - 1 %). И поток меж PHP и MySQL немалый будет.
3 вариант сейчас и использую.
Так как у меня малый процент совпадения такой вариант возник:
DELETE *
FROM aaa
WHERE bbb IN
(SELECT bbb FROM aaa WHERE COUNT(bbb)>1 GROUP BY bbb);
Таким образом скорость SELECT GROUP ровна N*N а у меня N*N/1000 до N*N/100 из-за процента и DELETE также ровна N, связ меж ними от 1 до N в сумме N/2 это максемальный и зависит от количества совпадений так что у меня N/2000 до N/200 в итоге получаем f1(N*N/1000 до N*N/100)+f2(N)+f3(N/2000 до N/200). Думаю это оптемально.
andymc:
--- Цитировать ---SELECT bbb FROM aaa WHERE COUNT(bbb)>1 GROUP BY bbb
--- Конец цитаты ---
Меня терзают смутные сомнения, работает ли это ...
будет время проверю...
Впрочем сама идея заменить DISTINCT на COUNT интересна
Akvar:
--- Цитировать ---SELECT bbb FROM aaa WHERE COUNT(bbb)>1 GROUP BY bbb
--- Конец цитаты ---
такое конечно не работает... так как при большой базе - сжирает память...
/ данная тема старая... но хочется поднять... так как в нете тяжело найти ответ - все неработающие идеи...
но необходимо расширить задачу:
1) при малом количестве совпадений скрипт выполнялся очень быстро...
2) при большом количестве совподений ( более 50% - не загибался сервер при количестве записий около 1-го милиона )
Делал кто-то такое ?
Навигация
Перейти к полной версии