4

-id、 -status 、-ratingフィールドを持ついくつかのスペーストップがあります


スペースtopには 2 つのインデックスがあります。

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

すごい!

4

2 に答える 2

3

3 番目のインデックスを作成しても意味がありません。評価で並べ替える必要がある場合は、それを 2 番目の部分として 2 番目のインデックスに含め、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}) 

{2} より大きいため、タプル {3, 1} を返します。

そして電話する

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

2 つのタプル {1, 1}、{3, 1} を返します

どちらの場合も、タプル {3, 1} は想定されていない可能性があります

于 2016-01-10T20:40:41.123 に答える