Генерация номера ID из текста / URL для быстрого "SELECT" - PullRequest
1 голос
/ 04 августа 2009

У меня следующая проблема:

  • У меня есть средство захвата каналов, которое каждые полчаса собирает новости из разных источников.

  • Я вставляю только записи, чьи URL-адреса уже не находятся в базе данных (URL-адрес используется, чтобы узнать, находится ли запись в базе данных).

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

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

  • Какую кодировку я могу использовать (я думал, что-то, противоположное base64) для кодирования заголовков?

  • Я предполагаю, что поиск повторяющихся чисел намного быстрее, чем поиск повторяющихся слов. Это правда или нет?
  • Вы предлагаете лучшее решение этой проблемы?

Ну, мне все равно, что в базе данных есть повторяющиеся записи, я просто не хочу показывать их пользователю. Как и в Google, он фильтрует повторяющиеся результаты, но показывает, если хотите.

Надеюсь, я это хорошо объяснил. Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 04 августа 2009

Заполните MD5 хеш URL и заголовка и создайте на нем индекс UNIQUE:

CREATE UNIQUE INDEX ux_mytable_title_url ON (title_hash, url_hash)

INSERT
INTO    mytable (url, title, url_hash, title_hash)
VALUES  ('url', 'title', MD5('url'), MD5('title'))

Чтобы выбрать как Google (один результат на title), используйте этот запрос:

SELECT  *
FROM    (
        SELECT  DISTINCT title_hash
        FROM    mytable
        ) md
JOIN    mytable mo
ON      mo.url_title = md.title_hash
        AND mo.url_hash =
        (
        SELECT  url_hash
        FROM    mytable mi
        WHERE   mi.title_hash = md.title_hash
        ORDER BY
                mi.title_hash, mi.url_hash
        LIMIT 1
        )
0 голосов
/ 04 августа 2009

@ Quassnoi может объяснить лучше, чем я, но я думаю, что нет никакой видимой разницы в производительности, если вы используете VARCHAR / CHAR или INT в индексе, чтобы использовать его позже для GROUP или другой способ найти дубликаты. Таким образом, вы можете использовать решение, предложенное ему , но использовать обычный INDEX вместо UNIQUE индекса и хранить дубликаты в базе данных, отфильтровывая их только при показе пользователям.

0 голосов
/ 04 августа 2009

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

для шифрования используйте

SELECT MD5(CONCAT('title', 'url'));

и перед каждой вставкой вы проверяете, существует ли закодированная конкатенация заголовка и URL в этой таблице.

...