Приложение для фильтрации базы данных за короткий промежуток времени - PullRequest
0 голосов
/ 04 апреля 2020

Мне нужно создать приложение, которое позволило бы мне получать телефонные номера пользователей с указанными условиями c как можно быстрее. Например, у нас есть 4 столбца в таблице sql (регион, доход, возраст [и 4-й номер с самим номером телефона]). Я хочу получить телефонные номера из таблицы с указанием c региона и дохода. Просто сделать запрос sql не поможет, потому что это занимает много времени. Обновление базы данных 1 раз в день, и у меня есть некоторое время для подготовки данных, как я буду sh.

Вопрос: Как бы вы сделали процесс получения телефонных номеров с указанием c условия как можно быстрее. O (1) в лучшем сценарии. Для быстрого доступа рассмотрим сохранение значений из таблицы sql в оперативной памяти.

Мне пришла в голову следующая идея:

  1. Для каждого номера телефона создать что-то вроде битрейта. 0, если конкретное условие ложно, и 1, если условие истинно. Но я не уверен, что смогу реализовать его для столбцов с ненулевыми значениями.
  2. Создать вектор с номерами телефонов.
  3. Создать вектор с наборами номеров телефонов.
  4. Чтобы получить телефонные номера - повторите для второго вектора и сравните наборы битов с требуемым.

Это вовсе не O (1). И я до сих пор не знаю, что делать с не булевыми столбцами. Я подумал, что, возможно, можно сделать что-то хорошее с помощью std :: unordered_map (все номера телефонов уникальны) или улучшить мою идею с помощью вектора и масок.

Ps SQL таблица потребляет 4 ГБ памяти, и я могу сохранить до 8 ГБ в оперативной памяти. 500 столбцов.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

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

Другой вариант - это иметь индекс для каждого столбца. В этом случае движок выполнит объединение индексов для увеличения производительности. Я также хотел бы рассмотреть возможность использования таблиц памяти. Если вы пишете в эту таблицу - подумайте о том, чтобы иметь реплику для чтения только для чтения. Чтобы оптимизировать вашу таблицу - сохраните ваши запросы где-нибудь и добавьте индекс (для нескольких столбцов) только для самых популярных запросов X. Это зависит от ваших ограничений памяти. Вы можете использовать NVME в качестве диска БД (если не можете загрузить его в память)

0 голосов
/ 04 апреля 2020

Я хочу получить телефонные номера из таблицы с указанием c региона и дохода.

Вы создадите индексы в базе данных на (region, income). Пусть база данных сделает всю работу.

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