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

我有一些字段的空间top:

-id,

-status,

-rating

我有两个索引为空间top:

--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' } })

我可以通过idstatus进行选择

--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})

有时我需要按评分进行排序选择status.

哪种方法最好?创建另一个带有部分statusrating的索引,并进行一些棘手的查询(如果可能)?还是继续按status选择,并在Lua过程中按rating排序?

感谢!

UPD: 谢谢,Kostya! 我这样修改了索引status

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})

太好了!

点赞
用户1229313
用户1229313

如果你需要按评分排序,创建第三个索引就没有意义了。只需要将评分包含在第二个索引的第二个部分中,使用GE/GT迭代器,数据将按顺序输出。这是一个内存数据库,增加索引的部分不会占用更多的内存,只会稍微减慢插入速度。

2016-01-08 23:15:18
用户5490933
用户5490933

当使用 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} 可能出乎意料。

2016-01-10 20:40:41