通过二级索引从Tarantool中选择,并按另一个字段和限制/偏移进行排序

时间:2016-01-08 10:39:36

标签: lua tarantool nosql

我有一些空格顶部字段:
 的 -id 下,
-status 下,
-rating

我有两个空间顶部的索引:

--primary  
box.space.top:create_index('primary', { type = 'TREE', unique = true, parts = { 1, 'NUM' } })
--status
box.space.top:create_index('status', { type = 'TREE', unique = false, parts = { 2, 'NUM' } })

我可以选择 id 状态

--select by id 
space.top.index.primary:select(someId) 
--select by status with limit/offset 
space.top.index.status:select({someStatus}, {iterator = box.index.EQ, offset = 0, limit = 20})

有时我需要选择状态并按评分排序 什么是最好的方法?创建另一个部分状态评级的索引,并在可能的情况下进行一些棘手的查询?或者继续按状态进行选择,并在Lua程序中按评分进行排序? 谢谢!

UPD: 谢谢,克斯特亚! 我修改了索引状态,如下所示:

box.space.top:create_index('status_rating', { type = 'TREE', unique = false, parts = { 2, 'NUM', 3 'NUM' } })

现在我可以查询:

local active_status = 1 
local limit = 20 
local offset = 0
box.space.top.index.status_rating:select({active_status}, {iterator = box.index.LE, offset=offset, limit=limit})

大!

2 个答案:

答案 0 :(得分:3)

创建第三个索引没有意义,如果需要按等级排序,只需将其作为第二部分包含在第二个索引中,并使用GE / GT迭代器,数据将按顺序排序。这是一个内存数据库,为索引添加更多部分并不会占用更多内存,只会减慢插入速度。

答案 1 :(得分:1)

使用GE / LE迭代器调用,部分索引可能不如预期,而不是没有匹配的元组或限制太高。

假设我们有以下元组(状态,评级):

{ 1, 1 }
{ 3, 1 }
{ 3, 2 }

比打电话

box.space.top.index.status_rating:select({2}, {iterator = box.index.GE, limit=1}) 

将返回元组{3,1},因为它大于{2}

并致电

box.space.top.index.status_rating:select({1}, {iterator = box.index.GE, limit=2})

将返回两个元组{1,1},{3,1}

在这两种情况下,元组{3,1}可能不期望