如何使 postgres 快速搜索
Posted
技术标签:
【中文标题】如何使 postgres 快速搜索【英文标题】:How to make postgres search fast 【发布时间】:2018-05-05 20:47:09 【问题描述】:我有一个 Postgresql 数据库,一张表中有超过 1000 亿行。
表架构如下:
id_1 | integer | | not null |
id_2 | bigint | | not null |
created_at | timestamp without time zone | | not null |
id_3 | bigint | | |
char1 | character varying(20) | | not null |
lang | character(6) | | not null |
gps | point | | |
some_dat | character varying(140)[] | | |
JSON | jsonb | | not null |
我正在尝试在 JSON 对象内部进行搜索并按 JSON 对象对数据进行排序,但问题是排序和返回数据需要太多时间。
例如,当按created_at
对数据进行排序时,结果也需要时间。
我正在努力使我的应用程序尽可能实时。
我有两个索引 id_1
和 id_2
另外,我尝试为每个 (id
) 使用物化视图,但问题是更新物化视图也需要很长时间。
请问有什么建议吗?
我正在使用 SSD 和 128 GB 内存的 Linux 服务器上运行 PostgreSQL 10.3。
谢谢,
【问题讨论】:
搜索查询中使用的列是什么?可以吗? 根据您对 json 数据执行的查询,在该列上放置一个 gin 索引会有所帮助,请参阅 postgresql.org/docs/10/static/datatype-json.html#JSON-INDEXING 以获取更多帮助优化查询发布特定查询和这些查询的解释分析输出.您是否针对您的硬件调整过 postgresql? @MacakM 是的,任何列。 @MohamedSaad 如果它可以是任何列,那么索引对您没有帮助,因为您必须在任何地方使用它们。你是对其他数据库开放还是必须是 PostgreSQL? @MacakM,不,我可以使用任何数据库。我尝试了 Cassandra,但没有为我完成这项工作。 【参考方案1】:如果你想用这样的表达式对查询结果进行排序:
ORDER BY expr1, expr2, ...
您需要以下索引来加快排序:
CREATE INDEX ON atable ((expr1), (expr2), ...);
如果这不起作用,因为表达式包含不是IMMUTABLE
的函数,则无法使用索引加速排序。在这种情况下,请考虑使用 IMMUTABLE
表达式重写您的查询。
【讨论】:
我确定它工作正常。但是由于您的问题没有显示您想要加快的查询等详细信息,因此很难为您提供帮助。以上是关于如何使 postgres 快速搜索的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Postgres 中搜索包含给定 unicode 字符的所有行