Как ускорить сравнение хэшей MD5 в базе данных - PullRequest
2 голосов
/ 15 июля 2011

У меня есть база данных, полная объявлений о продаже компьютеров, которые пришли со многих разных сайтов. База данных заполняется XML-файлами, которые поступают с отдельных сайтов рекламы, а затем анализируются и помещаются в центральную таблицу базы данных.

Файлы XML имеют следующие атрибуты для каждого компьютера: Марка, Модель, Размер HD, Размер ОЗУ, Скорость процессора, Цена, Расположение и т. Д.

В таблице центральной базы данных есть те же столбцы, плюс дополнительная в начале, которая является идентификатором поля для нашего собственного использования.

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

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

У меня была идея добавить дополнительный столбец в таблицу, который содержит MD5-хэш содержимого других столбцов. Когда XML анализируется, хеш MD5 создается для каждого объявления, а затем добавляется в качестве последнего столбца.

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

Тогда мой вопрос: является ли маршрут хеширования MD5 лучшим? Если это так, как бы я ускорить запрос? Если нет, то как лучше всего определить дубликаты рекламы?

Спасибо

Ответы [ 3 ]

3 голосов
/ 15 июля 2011

Мы используем хеши MD5, чтобы быстро идентифицировать строки и иметь сотни миллионов строк данных, поэтому я бы сказал, что это правильный выбор.

У вас есть индекс для столбца, содержащего MD5? Обратите внимание, что это может быть неуникальный индекс, если вы хотите сохранить повторяющиеся представления в таблице, или уникальный индекс, если вы хотите предотвратить вставку дубликата.

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

Имейте в виду, что малейшее изменение текста объявления приведет к новому значению MD5 (даже к дополнительному пробелу). Если могут быть изменения форматирования, вы можете нормализовать данные перед выполнением MD5, например удаляя все пробелы, знаки пунктуации и последовательно обрабатывая данные.

2 голосов
/ 15 июля 2011

Может помочь добавление индекса в столбце хеша.

0 голосов
/ 16 июля 2011

Ну, так как вас интересует только поиск дубликатов с использованием MD5, вероятно, здесь не самый лучший выбор. Помните, что MD5 был спроектирован как криптографический хеш, и скорость не была главной целью для этого (на самом деле многие современные безопасные хеши сделаны МЕДЛЕННО по замыслу!).

Я бы лично реализовал простой хеш и использовал бы его. Как отметил Эрик Дж., Вы должны все равно нормализовать свои данные перед их использованием, а после шага нормализации просто запустите их через вашу хеш-функцию и используйте это.

Самый простой способ - обработать все поля как строки и просто использовать обычный алгоритм хеширования строк:

s [0] * KEY ^ (n-1) + s [1] * KEY ^ (n-2) + ... + s [n-1]

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

В любом случае вернемся к вашей реальной проблеме: добавление индекса (неуникального!) Будет самым простым решением, но я бы проверил, быстрее ли активировать индекс только после добавления всех файлов (что означает, что БД придется отсортируйте файлы один раз, но при вставке это будет быстрее) - вам придется протестировать этот материал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...