Здравствуйте и спасибо за чтение моего вопроса!
В настоящее время мы используем PostgreSQL v.10 на 3 узлах через столон (https://github.com/sorintlab/stolon) У нас есть 3 таблицы (я хочу упростить свой вопрос):
- Счет (150 000 000 записей)
- Пользователь (35 000 000 записей)
- Пользователь_адрес (20 000 000 записей)
Основной запрос выглядит следующим образом (исходный запрос большой, использует временную таблицу и имеет много условий, но в примере показана моя проблема.)
select
i.*
from invoice as i
inner join get_similar_name('Jon') as s on i.name ilike s.name
left join user_address as a on i.user_id = a.user_id
where
a.state = 'OH'
and
i.last_name = 'Smith'
and
i.date between '2016-01-01'::date and '2018-12-31'::date;
Функция get_similar_name
возвращает похожие имена (пример: get_similar_name('Jon') will return John, Jonny, Jonathan ...
и т. д.) в среднем 200 - 1000 имен. Я должен использовать функцию: \
Запрос выполнялся долго, около 30 - 120 секунд, но если я исключуфункция get_similar_name
из запроса, тогда время выполнения будет не более 1 секунды.
Я уже настроил PostgreSQL и сервер работает довольно хорошо. Я также создал индексы, и мой запрос не использует seq scan ии т.д.
У нас нет возможностисоздавать разделенные таблицы, потому что у нас есть много столбцов для этого.Мы не можем разделить таблицу только на одну строку.
Я думаю о переносе моего склада в MongoDB
Мои вопросы:
- Прав ли я в переездев MongoDB?
- Повысить производительность, если я переместу хранилище из PostgreSQL на 20-40 узлов под управлением MongoDB?
- Возможно ли иметь функцию
get_similar_name
в MongoDB или аналогичном решении?Если да, то как? - У вас есть хороший опыт использования полнотекстового поиска в MongoDB?
- Это правильный способ использования MongoDB в рабочей среде?
- Не могли бы вы посоветовать"google-vector" для правильного решения по вашему мнению?