我一直在试验PostgreSQL和PL/V8,它们将V8 JavaScript引擎嵌入到PostgreSQL中。使用它,我可以查询数据库中的JSON数据,这非常棒
基本方法如下:
创建或替换函数
json_字符串(数据json,键文本)将文本返回为$$
var data=JSON.parse(数据);
返回数据[键];
$$语言plv8不可变严格;
从json_字符串(数据,’name’)中选择id,数据,如’Z%’;
使用V8,我可以将JSON数据解析为JS,然后返回一个字段,我可以将其用作常规pg查询表达式
但是
在大型数据集上,性能可能是一个问题,因为我需要解析数据的每一行。
解析器速度很快,但它肯定是过程中最慢的部分,而且每次都必须进行
我试图解决的是(为了最终解决一个实际问题)是否有办法缓存或预处理JSON。。。即使将JSON的二进制表示形式存储在表中,V8也可以将其作为JS对象自动使用,这也可能是一个胜利。我已经考虑过使用messagepack或protobuf等替代格式,但我认为它们在任何情况下都不一定会像本机JSON解析器那样快
思想
PG有BLOB和二进制类型,所以数据可以存储在二进制中,然后我们只需要一种方法将其打包到V8中
Postgres支持对任意函数调用的索引。下面的索引应该可以做到这一点:
在事物上创建索引json_idx(json_字符串(字段,'name');