您好,感谢您阅读我的问题!
目前,我们通过stolon在3个节点上使用PostgreSQL v.10(https://github.com/sorintlab/stolon)我们有3张表(我想让我的问题变得简单(:
- 发票(150000条记录(
- 用户(35000 000条记录(
- 用户地址(20000 000条记录(
主查询看起来是这样的(原始查询是一个很大的,使用了一个临时表,并且有很多where条件,但示例显示了我的问题。(
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扫描等。
我们不可能制作分区表,因为我们有很多列。我们不能把一张桌子只分一行。
我考虑将我的仓库迁移到MongoDB
我的问题是:
- 我搬到MongoDB是对的吗
- 如果我将仓库从PostgreSQL移动到MongoDB控制下的20-40个节点,会提高性能吗
- 是否可以在MongoDB或类似的解决方案上使用
get_similar_name
功能?如果是,如何 - 你有在MongoDB中使用全文搜索的良好经验吗
- 在生产中使用MongoDB是正确的方法吗
- 你能根据你的意见建议一个"谷歌矢量"的正确解决方案吗
我不知道迁移到MongoDB是否能解决文本搜索问题,但Postgres具有Vector和trigram等出色功能。你厌倦了这些吗?
https://www.compose.com/articles/mastering-postgresql-tools-full-text-search-and-phrase-search/
https://www.postgresql.org/docs/9.6/pgtrgm.html
在我之前的项目中,我们使用了pg_trgm,并且对它的性能非常满意。