2016-01-08 94 views
3

我有一些空間頂部與字段:
-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' } }) 

我可以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: 謝謝,Kostya! 我修正指數狀態這樣的:

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

太好了!

+0

善意的提醒,需要你的數據的詳細信息。 每個狀態的平均行數是多少? 你會閱讀所有頁面還是隻閱讀第一頁? – dgreen

+0

平均行數約爲2000 - 3000單位。我將使用限制/偏移選項作爲分頁 –

回答

3

創建第三個索引是沒有意義的,如果您需要按評級排序,只需將其作爲第二個部分包含到第二個索引中,並使用GE/GT迭代器,數據就會按順序排列。這是一個內存數據庫,向索引添加更多部分不會佔用更多的內存,只會減慢插入的速度。

+0

它的工作原理!我的實施中的Kostya解決方案在** UPD **問題部分 –

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}可能預計不會