为啥我在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 存储过程中查询没有“结果数据的目标”?
Sequelize:在 PostgreSQL 的 JSON 数据类型上使用 $like