如何使 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_1id_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 Copy忽略大文本文件的第一行

Postgres如何使2个数字字段彼此唯一

如何在 Postgres 中搜索包含给定 unicode 字符的所有行

如何在 JSONField 中使用 Postgres 在 Django 中搜索带有空格的键?

使用LIKE的Postgres节点搜索查询,如何设置%

Slick Postgres:如何使用 like 运算符在字符串列表中搜索