IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   Подскажите, кто, как борется с повторами в базах MySQL (https://www.imho.ws/showthread.php?t=93390)

Andrey Zak 29.09.2005 17:33

Подскажите, кто, как борется с повторами в базах MySQL
 
Существует база, которая быстро копится записями (~300000). Контролировать создание повторов нет возможности. Стоит задача автоматической чистки. Как алгоритм, вижу следующее решение: оправлять в топку строки, где id не попадает в список сгруппированных записей по ключевым полям. Только мне видится, что работать это будет не быстро из-за группировки и NOT IN.
PHP код:

Пример
DELETE FROM таблица 
   WHERE id 
   NOT IN 
(SELECT max(idFROM таблица 
                            GROUP BY поле1
поле2

Поделитесь своим опытом, кто как решает эту задачу?

Naked 29.09.2005 18:41

а нет возможности создать еще одну такую же базу и в нее записывать DISTINCT от первой, так вроде и достаточно быстро будет (надо будет обновлять не всю базу, а только после последнего обновления) и просто вроде...

Sheryld 29.09.2005 20:38

А почему бы просто не создать constraint типа unique index на каких-нибудь полях(желательно чтобы поля были поменьше, например integer), и тогда дубликаты не будут вставляться, а будет соотвествующее сообщение об ошибке, которое ты благопалучно перехватишь.

Подзапросы есть только в mysql 4.1 и выше.

Andrey Zak 29.09.2005 23:44

Цитата:

Sheryld:
А почему бы просто не создать constraint типа unique index на каких-нибудь полях(желательно чтобы поля были поменьше, например integer), и тогда дубликаты не будут вставляться, а будет соотвествующее сообщение об ошибке, которое ты благопалучно перехватишь.
Нет нельзя, т.к. значения отдельных полей может повторяться, а вот комбинация нескольких полей при определенных условиях должна быть уникальна.

Цитата:

Sheryld:
Подзапросы есть только в mysql 4.1 и выше.
Не проблема, стоит 4.1.11
Цитата:

The_naked:
а нет возможности создать еще одну такую же базу и в нее записывать DISTINCT от первой, так вроде и достаточно быстро будет
Хотелось бы все налету. DISTINCT это тот же GROUP BY - по скорости тоже самое.
Цитата:

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

Есть еще идея через LEFT JOIN. Буду пробовать.

Sheryld 29.09.2005 23:54

ну дык индекс то можно построить и на нескольких полях.

единственное, что нужно помнить это то, что

(a + b) != (b + a)

Andrey Zak 30.09.2005 00:05

Если можно пример для наглядности. А как в индекс заложить условия? К сожалению в моем случае, я могу только разгребать. И как я уже написал повторы нужно понимать шире.

Andrey Zak 30.09.2005 11:54

Поигрался с LEFT JOIN. Результат очень порадовал.
PHP код:

SELECT id
FROM таблица
LEFT JOIN 
(
  
SELECT maxid ) AS id1
  FROM таблица
  GROUP BY 
IF (поле1 ''поле2поле1), поле3) AS таблица1 
ON таблица
.id таблица1.id1
WHERE таблица1
.id1 IS NULL 
LIMIT 0 
30 

В этом варианте Запрос занял 0.5475 сек на пробной базе 4000 записей. В первом примере я так и не дождался ответа, прибил процесс.

Может порекомендуете, как еще можно оптимизировать предложенный вариант. Также вопрос остается открытый. Интересны подходы по борьбе с существующими повторами (схожими записями).


Часовой пояс GMT +4, время: 08:59.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.