Общие > Базы данных

Помагите с запросом

(1/4) > >>

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-го милиона )

Делал кто-то такое ?

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 
Перейти к полной версии