4

我有一些空间顶部的字段:
-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' } })

我可以通过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})

有时我需要按状态选择并按评级排序。
什么是最好的方法?如果可能的话,创建另一个带有部件状态评级的索引并进行一些棘手的查询?还是继续在 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})

伟大的!

4

2 回答 2

3

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

于 2016-01-08T23:15:18.380 回答
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} 可能不是预期的

于 2016-01-10T20:40:41.123 回答