2017-08-19 37 views
0

我试图从一个非常大的数据库(每月1.5亿文件)在指定日期(变量)CouchbaseN1QL中获取最新文档。日期的最新文档可以是任何时间(前一秒或上一个月)。请注意,日期在Unix Epoch中。下面是文档的结构:如何从特定日期获取最新文档?

{ 
    "type" : "person", 
    "id":"001", 
    "name":"John Doe", 
    "date":"1491199810.435" 
} 

我有指数日期:

CREATE INDEX `date` ON `mytable`(`date`) WITH { "defer_build"=true } 

通常在我处理的Postgres,我通常会做:

SELECT * WHERE date <="1491199813.000" ORDER BY date DESC LIMIT 1; 

有指标Postgres中的日期恰好过了毫秒级响应。

但是,Couchbase ORDER BY ... LIMIT是非常缓慢的。在相同的硬件和相同的数据上需要几分钟的时间。

肯定会有一种有效的方式从Couchbase N1QL获取指定日期的单个最新文档,但我还找不到它。

你有什么想法吗?

回答

1

创建否定功能指数和更改查询像下面在预5.0.0

CREATE INDEX `forex_dt` ON `forex`(-TONUMBER(`date`)); 
SELECT * FROM `forex` WHERE -TONUMBER(`date`) >= -1491199813.000 ORDER BY -TONUMBER(`date`) LIMIT 1; 

在5.0.0

CREATE INDEX `forex_dt` ON `forex`(`date` DESC); 
SELECT * FROM `forex` WHERE `date` <= "1491199813.000" ORDER BY `date` DESC LIMIT 1; 
+0

你是在暗示从索引中选择?这显然不起作用[ { “code”:12003, “msg”:“Keyspace not found keyspace forex_dt - cause:No bucket named forex_dt”, “query_from_user”:“SELECT * FROM'forex_dt_desc' WHERE'instruments '='EURGBP'和'dt' <1492504798 LIMIT 1“ } ]。你能否详细说明一下? – uzla

+0

Typo修复它。如果您需要仪器,也可以将查询更改为CREATE INDEX'forex_ddesc' ON'forex'(instruments,-TONUMBER('date')); SELECT * FROM'forex' WHERE instruments ='EURGBP,-TONUMBER('date')> = -1491199813.000 ORDER BY工具,-TONUMBER('date')限制1; – vsr

+0

它的工作原理!辉煌!十分感谢! – uzla

相关问题