Лучший способ справиться с 900 000 записей базы данных и почтовых индексов? - PullRequest
3 голосов
/ 08 июня 2011

Компания, с которой мы работаем, хочет предоставлять нам файл CSV объемом 1,2 ГБ каждый день, содержащий около 900 000 списков продуктов.Лишь небольшая часть файла меняется каждый день, может быть, менее чем на 0,5%, и на самом деле это просто продукты, которые добавляются или удаляются, а не изменяются.Нам нужно показать списки продуктов нашим партнерам.

Что усложняет ситуацию, так это то, что наши партнеры должны видеть списки продуктов, доступные только в радиусе 30-500 миль от их почтового индекса.В каждой строке списка продуктов есть поле для определения фактического радиуса продукта (для некоторых только 30, для некоторых 500, для некоторых 100 и т. Д. 500 - это максимум).Партнер в данном почтовом индексе, скорее всего, будет иметь только 20 результатов или около того, что означает, что будет куча неиспользованных данных.Мы не знаем всех почтовых индексов партнеров заблаговременно.

Мы должны учитывать производительность, поэтому я не уверен, как лучше это сделать.

Должен ли яиметь две базы данных - одну с почтовыми индексами и широтой / долготой и использовать формулу Haversine для расчета расстояния ... а другую - базу данных реальных продуктов ... и что мне тогда делать?Вернуть все почтовые индексы в пределах указанного радиуса и найти совпадение в базе данных продукта?Для радиуса в 500 миль это будет тонна почтовых индексов.Или написать функцию MySQL?

Мы могли бы использовать Amazon SimpleDB для хранения базы данных ... но тогда у меня все еще есть проблема с почтовыми индексами.Я мог бы сделать два «домена», как называет их Amazon, один для продуктов, а другой для почтовых индексов?Я не думаю, что вы можете сделать запрос по нескольким доменам SimpleDB.По крайней мере, я не вижу этого нигде в их документации.

Я полностью открыт для какого-то другого решения.Это не должен быть PHP / MySQL или SimpleDB.Просто помните, что наш выделенный сервер представляет собой P4 с 2 ГБ.Мы могли бы модернизировать ОЗУ, просто мы не можем тратить на это тонну вычислительной мощности.Или даже храните и обрабатывайте базу данных каждую ночь на VPS где-нибудь, где не будет проблем, если VPS будет невыносимо медленным, пока обрабатывается CSV в 1,2 Гб.Мы могли бы даже обработать файл в автономном режиме на настольном компьютере, а затем удаленно обновлять базу данных каждый день ... за исключением того, что у меня все еще есть эта проблема с почтовыми индексами и списками продуктов, требующими перекрестных ссылок.

Ответы [ 2 ]

2 голосов
/ 08 июня 2011

Возможно, вы захотите взглянуть на PostgreSQL и Postgis .Он имеет функции, аналогичные MySQL функции пространственного индексирования , без необходимости использования MyISAM (которые, по моему опыту, имеют тенденцию к повреждению в отличие от InnoDB).

В частности, в Postgres 9.1, что позволяет k-ближайший сосед искать запросов с использованием индексов GIST.

1 голос
/ 08 июня 2011

Ну, это действительно интересная проблема.

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

Что касается второго, это больше моя область знаний.Вы можете сделать так, чтобы ваш клиент выгружал CSV вам в том виде, в каком он есть в данный момент, сохраните его копию со вчерашнего дня и запустите его с помощью утилиты diff, или вы можете использовать Perl, PHP, Python, Bash или любые другие инструменты, которые у вас есть, чтобынайти строки, которые изменились.Передайте их во второй блок, который обновит вашу базу данных.Я имел дело с клиентами с проблемами в этом направлении, и написание сценариев, как правило, лучший выбор.Если вам нужна помощь в организации вашего сценария, который всегда доступен.

...