2010-09-29 3 views
1

У меня есть набор из 5 миллионов строк. Они хранятся в одной таблице MySQL MySQL. Мое приложение должно выполнять поиск и проверять, задана ли данная строка в наборе. Конечно, это можно сделать с помощью HashSet (на Java). Но вместо того, чтобы создавать собственное решение, мне было интересно, существуют ли какие-либо существующие широко используемые проверенные решения? Это похоже на общий сценарий. Решение должно быть масштабируемым (набор может увеличиться более чем на 5 миллионов), иметь отказоустойчивость (возможно, распределенную) и хорошо работать под огромным количеством запросов. Какие-либо предложения?Быстрый, масштабируемый поиск строк

Обновление: Мое приложение также может запросить проверку наличия заданного набора строк в глобальном (5 миллионов экземпляров).

+0

Возможно, я не понимаю, что вы подразумеваете под «выполнением поиска» и «проверьте, задана ли данная строка в наборе» - не это просто то, для чего используется оператор выбора SQL? Отказоустойчивость и масштабирование также являются более или менее нормальными функциями РСУБД. – Sorpigal

+0

Tries используются для быстрого поиска строк. Они намного эффективнее памяти, чем hashtables/hashsets, и не намного медленнее. – leppie

+0

@Sorpigal: Да, но обычные запросы RDBMS не достаточно быстры. Я также обновил свой вопрос с точным сценарием. Надеюсь, что это очистит. – talonx

ответ

1

Вы можете попробовать Trie или Patricia-trie .Отель второй больше памяти efficient.Also here вы можете найти сравнение 2 структур данных [TRIE, TreeSet], В памяти базы данных и их производительность.

+0

сообщение перед проектом Trie не очень обнадеживает - «Обратите внимание на любых посетителей, это прекрасный код SAMPLE, но не производственный код. Он был написан неопытным программистом (мне в то время) за один вечер». – talonx

0

В то время как Trie может быть лучшим решением, двоичный поиск в отсортированном списке строк также должен хорошо выполнять время работы.

1

Попробуйте memcached, высокопроизводительную систему кеширования с распределенной памятью. Вы просматриваете, используя хэши ключей/значений. Facebook uses memcached, как и многие другие высоко масштабируемые сайты. Нужно хранить больше строк? Просто добавьте в кластер больше memcached-экземпляров. Кроме того, вы можете использовать в двухуровневой системе кэширования, где вы сначала запрашиваете memcached, если пропустить кеш, а затем запросить полную базу данных.

Рассматривали ли вы добавление column indexing в свою базу данных MySQL? Поддерживаются hash, b-tree и r-tree.

MySQL также может быть replicated and clustered для высокой масштабируемости.

+0

Как это решить проблему? – reinierpost

+0

Это распределенная система хэширования для эффективного поиска ключей/значений. – burkestar

Смежные вопросы