imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Веб-мастеру > Веб-программирование
Опции темы
Старый 29.09.2005, 17:33     # 1
Andrey Zak
Junior Member
 
Аватар для Andrey Zak
 
Регистрация: 27.08.2005
Адрес: spb.ru
Сообщения: 100

Andrey Zak Путь к славе только начался
Exclamation Подскажите, кто, как борется с повторами в базах MySQL

Существует база, которая быстро копится записями (~300000). Контролировать создание повторов нет возможности. Стоит задача автоматической чистки. Как алгоритм, вижу следующее решение: оправлять в топку строки, где id не попадает в список сгруппированных записей по ключевым полям. Только мне видится, что работать это будет не быстро из-за группировки и NOT IN.
PHP код:
Пример
DELETE FROM таблица 
   WHERE id 
   NOT IN 
(SELECT max(idFROM таблица 
                            GROUP BY поле1
поле2
Поделитесь своим опытом, кто как решает эту задачу?
__________________
Сейчас кто-то получит яндексом по рамблеру и отлетит гугол.

Последний раз редактировалось Andrey Zak; 29.09.2005 в 18:36.
Andrey Zak вне форума  
Старый 29.09.2005, 18:41     # 2
Naked
::VIP::
 
Аватар для Naked
 
Регистрация: 15.05.2005
Адрес: Питер
Сообщения: 1 194

Naked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked СэнсэйNaked Сэнсэй
а нет возможности создать еще одну такую же базу и в нее записывать DISTINCT от первой, так вроде и достаточно быстро будет (надо будет обновлять не всю базу, а только после последнего обновления) и просто вроде...
__________________
Чтобы воля стала действующим началом, тело должно быть совершенным.
Naked вне форума  
Старый 29.09.2005, 20:38     # 3
Sheryld
Full Member
 
Регистрация: 29.05.2002
Сообщения: 544

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

Подзапросы есть только в mysql 4.1 и выше.
__________________
убрано по просьбе администратора
Sheryld вне форума  
Старый 29.09.2005, 23:44     # 4
Andrey Zak
Junior Member
 
Аватар для Andrey Zak
 
Регистрация: 27.08.2005
Адрес: spb.ru
Сообщения: 100

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

Цитата:
Sheryld:
Подзапросы есть только в mysql 4.1 и выше.
Не проблема, стоит 4.1.11
Цитата:
The_naked:
а нет возможности создать еще одну такую же базу и в нее записывать DISTINCT от первой, так вроде и достаточно быстро будет
Хотелось бы все налету. DISTINCT это тот же GROUP BY - по скорости тоже самое.
Цитата:
(надо будет обновлять не всю базу, а только после последнего обновления) и просто вроде...
Не все так просто. Следить надо за всей базой. Повторы имеются ввиду не двойное нажатие на кнопку, а, например, повторное размещение одной и той же информации через день, неделю, месяц. Повторы - схожая устаревшая информация, которую держать в базе особого смысла нет. Но и тупо удалаять по дате тоже нельзя.

Есть еще идея через LEFT JOIN. Буду пробовать.
__________________
Сейчас кто-то получит яндексом по рамблеру и отлетит гугол.
Andrey Zak вне форума  
Старый 29.09.2005, 23:54     # 5
Sheryld
Full Member
 
Регистрация: 29.05.2002
Сообщения: 544

Sheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царствеSheryld Луч света в тёмном царстве
ну дык индекс то можно построить и на нескольких полях.

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

(a + b) != (b + a)
__________________
убрано по просьбе администратора
Sheryld вне форума  
Старый 30.09.2005, 00:05     # 6
Andrey Zak
Junior Member
 
Аватар для Andrey Zak
 
Регистрация: 27.08.2005
Адрес: spb.ru
Сообщения: 100

Andrey Zak Путь к славе только начался
Если можно пример для наглядности. А как в индекс заложить условия? К сожалению в моем случае, я могу только разгребать. И как я уже написал повторы нужно понимать шире.
__________________
Сейчас кто-то получит яндексом по рамблеру и отлетит гугол.
Andrey Zak вне форума  
Старый 30.09.2005, 11:54     # 7
Andrey Zak
Junior Member
 
Аватар для Andrey Zak
 
Регистрация: 27.08.2005
Адрес: spb.ru
Сообщения: 100

Andrey Zak Путь к славе только начался
Поигрался с 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 записей. В первом примере я так и не дождался ответа, прибил процесс.

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

Последний раз редактировалось Andrey Zak; 30.09.2005 в 11:56.
Andrey Zak вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


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




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