Задать вопрос

Какие решения существуют для индексированного поиска по десяткам полей огромных таблиц?

Ищем решение для поиска по любому полю в нескольких связанных таблицах реляционной БД: документы, транзакции, проводки, события. Размер таблиц — десятки и сотни млн записей.
Поиск идет в одной из шард, определяемой по дате.

В таблицах бывает до 80 полей, и различным отделам они все нужны для анализа, и практически все задействованы в поиске. Поиск почти всегда точечный с прицелом на 1-2 записи из каждой таблицы, но иногда нужно выбрать из одной из таблиц от десятков до сотен тысяч записей (1 документ - 500 тысяч связанных проводок). Для поиска используется 2-3 поля, которые являются какими-либо идентификаторами, сильно сужающими выборку (до нескольких записей в пределах нужной даты).

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

Можно не SQL.
  • Вопрос задан
  • 3648 просмотров
Подписаться 4 Простой 6 комментариев
Решения вопроса 1
@NikZanyat
Серебряная пуля в вашем случае - это квинтетная модель данных. Одна из её реализаций - Конструктор Интеграл (недавно переименовался в Интеграм, integram.io).
Вот ваше решение с миллионами записей и мгновенным поиском по любому полю:
https://ideav.online/sber/object/287
или вот ещё старый стенд покликать:
https://dev.forthcrm.ru/my/
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
mayton2019
@mayton2019
Bigdata Engineer
В реляционных БД нельзя сделать серебрянную пулю которая всегда будет успешно стрелять.
Чаще всего в БД делают так. Анализируют какие группы запросов наиболее тяжелые
и пытаются материализовать по 1 mat view на каждую группу.

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

Поиск идет в одной из шард, определяемой по дате.

Попробуйте более детальную дату. От суток - к часам. От часов к минутам.

Для поиска используется 2-3 поля, которые являются какими-либо идентификаторами, сильно сужающими выборку (до нескольких записей в пределах нужной даты).


Если у вас есть тренд на использование 1-2 дней (оперативная информация)
то отгрузите этот опер-период в отдельную свехр-быструю БД (Redis)
и сгенерируйте все возможные комбинации запросов и ответов.

Звучит странно но такая материализация может быть выгоднее чем точечные
запросы (которые у вас не являеются OLTP т.к. возвращают в общем случае
более чем 1 строку).

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

Здесь я не очень понял, является ли указание отдела взаимоисключающим. Но попробуйте
подумать направлении фасетов (facets). Это почти тот-же партишенинг-шардинг но ключ
партишенинга будет сочетанием нескольких атрибутов.
Ответ написан
Комментировать
tsklab
@tsklab
Здесь отвечаю на вопросы.
Ответ написан
Комментировать
opium
@opium
Просто люблю качественно работать
Если дешёво и сердито то сфинкс, если дорого и богато то еластик
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы