为啥我在postgresql的json数据中查询,速度会比mysql慢很多

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥我在postgresql的json数据中查询,速度会比mysql慢很多相关的知识,希望对你有一定的参考价值。

参考技术A   PostgreSQL 9.4 引入了jsonb,一个新的列类型用于存储文档到你的关系数据库中。jsonb和json在更高的层面上看起来几乎是一样的,但在存储实现上是不同的。  使用jsonb的优势在于你可以轻易的整合关系型数据和非关系型数据,在性能方面,可以比大多数类似于MongoDB这样的非关系数据库更好  理解json和jsonb之间的不同  因此,两种列类型之间的区别是什么?当我们比较写入数据速度时,由于数据存储的方式的原因,jsonb会比json稍微的慢一点。  json存储完整复制过来的文本输入,必须一遍又一遍的解析在你调用任何函数的时候。它不支持索引,但你可以为查询创建表达式索引。  jsonb存储的二进制格式,避免了重新解析数据结构。它支持索引,这意味着你可以不使用指定的索引就能查询任何路径。  其他的不同包括,json列会每次都解析存储的值,这意味着键的顺序要和输入的时候一样。但jsonb不同,以二进制格式存储且不保证键的顺序。因此,如果你有软件需要依赖键的顺序,jsonb可能不是你的应用的最佳选择。本回答被提问者采纳

为啥在 PostgreSQL 存储过程中查询没有“结果数据的目标”?

【中文标题】为啥在 PostgreSQL 存储过程中查询没有“结果数据的目标”?【英文标题】:Why has a query no "destination for result data" in PostgreSQL stored procedure?为什么在 PostgreSQL 存储过程中查询没有“结果数据的目标”? 【发布时间】:2015-11-01 00:36:55 【问题描述】:

我是 postgre 的新手,但遇到了问题。 我想完善程序:

CREATE OR REPLACE FUNCTION autenticarusuario()
RETURNS users AS
$BODY$`
DECLARE
 login text;
 senha text;
BEGIN
SELECT * FROM users WHERE login_user = login
            AND pass_user = senha;
END;
$BODY$
  LANGUAGE plpgsql IMMUTABLE
  COST 100;
ALTER FUNCTION autenticarusuario()
  OWNER TO postgres;

但我总是收到消息:

ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function autenticarusuario() line 6 at SQL statement
********** Error **********

ERROR: query has no destination for result data
SQL state: 42601
Hint: If you want to discard the results of a SELECT, use PERFORM instead.
Context: PL/pgSQL function autenticarusuario() line 6 at SQL statement

【问题讨论】:

【参考方案1】:

这里的问题是你告诉 Postgres“开始执行这个函数,然后执行这个查询”。 Postgres 抱怨是因为您没有告诉它如何处理查询结果。您可以使用 SELECT INTO 语句,也可以使用 RETURN QUERY 返回单个列,例如用户 ID:

CREATE OR REPLACE FUNCTION autenticarusuario()
RETURNS SETOF INTEGER AS
$BODY$`
DECLARE
 login text;
 senha text;
BEGIN
  RETURN QUERY SELECT id 
                 FROM users 
                WHERE login_user = login
                  AND pass_user = senha;
END;
$BODY$
  LANGUAGE plpgsql IMMUTABLE
  COST 100;

如果您想为每条记录返回多个字段,您可以使用与详述here 类似的策略并创建自己的类型。

【讨论】:

【参考方案2】:

我的同事也遇到了类似的问题。然后,她在 select 查询之前使用了 OPEN MYCURS,在 select 查询之后使用了 RETURN MYCURS

【讨论】:

以上是关于为啥我在postgresql的json数据中查询,速度会比mysql慢很多的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 postgresql 中的视图不使用索引?

为啥在 PostgreSQL 存储过程中查询没有“结果数据的目标”?

Sequelize:在 PostgreSQL 的 JSON 数据类型上使用 $like

如何在 Postgresql 中添加、更新和删除 Json 数据类型?

为啥此查询在 PostgreSQL 中不使用仅索引扫描?

PostGreSQL Json数据存储和条件查询