Select 来自 Tarantool 按二级索引按另一个字段排序和 limit/offset
Select from Tarantool by secondary index with sort by another field and limit/offset
我有一些 space top 字段:
-id,
-状态,
-评分
我有两个 space 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' } })
我可以通过 id 或 status
select
--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})
有时我需要 select 按 status 排序 rating.
什么是最好的方法?使用 status、rating 部分创建另一个索引,并在可能的情况下进行一些棘手的查询?或者在 Lua 程序中按 status 继续 select 并按 rating 排序?
谢谢!
更新:
谢谢,科斯蒂亚!
我像这样修改了索引 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})
太棒了!
创建第三个索引没有意义,如果你需要按评分排序,就把它作为第二部分包含到第二个索引中,并使用GE/GT迭代器,数据就会出来下令。这是一个 in-memory 数据库,向索引添加更多部分不会占用更多内存,只会减慢插入速度。
使用 GE/LE 迭代器和部分索引调用可能有效 不如预期 没有匹配的元组或限制太高。
假设,我们有以下元组(状态,评级):
{ 1, 1 }
{ 3, 1 }
{ 3, 2 }
比打电话
box.space.top.index.status_rating:select({2}, {iterator = box.index.GE, limit=1})
将 return 元组 {3, 1} 因为它大于 {2}
并致电
box.space.top.index.status_rating:select({1}, {iterator = box.index.GE, limit=2})
将 return 两个元组 {1, 1}, {3, 1}
在这两种情况下,元组 {3, 1} 可能不是预期的
我有一些 space top 字段:
-id,
-状态,
-评分
我有两个 space 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' } })
我可以通过 id 或 status
select--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})
有时我需要 select 按 status 排序 rating.
什么是最好的方法?使用 status、rating 部分创建另一个索引,并在可能的情况下进行一些棘手的查询?或者在 Lua 程序中按 status 继续 select 并按 rating 排序?
谢谢!
更新: 谢谢,科斯蒂亚! 我像这样修改了索引 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})
太棒了!
创建第三个索引没有意义,如果你需要按评分排序,就把它作为第二部分包含到第二个索引中,并使用GE/GT迭代器,数据就会出来下令。这是一个 in-memory 数据库,向索引添加更多部分不会占用更多内存,只会减慢插入速度。
使用 GE/LE 迭代器和部分索引调用可能有效 不如预期 没有匹配的元组或限制太高。
假设,我们有以下元组(状态,评级):
{ 1, 1 }
{ 3, 1 }
{ 3, 2 }
比打电话
box.space.top.index.status_rating:select({2}, {iterator = box.index.GE, limit=1})
将 return 元组 {3, 1} 因为它大于 {2}
并致电
box.space.top.index.status_rating:select({1}, {iterator = box.index.GE, limit=2})
将 return 两个元组 {1, 1}, {3, 1}
在这两种情况下,元组 {3, 1} 可能不是预期的