2016-02-23 25 views
2

有一個如下結構的文件多索引的使用:論ArangoDB

{ 
    path: String, 
    enabled: Long, 
    disabled: null || Long, 
    // other fields... 
} 

我想通過路徑的前綴和一些數量和文件的時間戳之間的數值關係的組合看文件了(僞)

SELECT e FROM entries 
WHERE 
    e.path STARTS WITH "somePrefix" 
    AND e.enabled <= timestamp 
    AND (
    e.disabled == null 
    OR timestamp < e.disabled 
) 

什麼樣的索引結構最受益?我應該在enabled字段上有一個非稀疏跳過列表索引+ disabled上有一個稀疏跳過列表索引,並且path上有一個全文非稀疏索引嗎? ArangoDB能夠爲這些類型的查詢使用多個索引嗎?我閱讀索引使用的文檔頁面,但我仍然不清楚。

回答

2

ArangoDB可以在同一個收集使用多個索引如果過濾條件與邏輯或組合,並且索引滿足分支條件。

在您的查詢的情況下,你有三個條件與邏輯和相結合,用含有後者。

AQL中沒有STARTS WITH謂詞,但是您可以使用使用前綴範圍構造的範圍查詢:e.path >= @lower && e.path < @upper。對於搜索值"somePrefix",邊界將翻譯爲@upper,即"somePrefix", and @lower being「somePrefiy」(搜索值最後一個字符增加1)。

path上創建跳過列表索引將使查詢使用該索引。

包括搜索條件enabled,到目前爲止的組合條件是e.path >= @lower && e.path < @upper && e.enabled <= @timestamp。儘管可以在多個屬性上創建跳過列表索引,但它不會在pathenabled這兩個位置上使用,但僅在path上使用。反轉索引屬性的順序(即enabled第一個,然後path)也無濟於事,因爲索引僅用於enabled,而不用於path

通常,skiplist索引將用於可產生連續範圍的條件部分。如果在等號比較中使用最左側的索引屬性(例如e.path == @path && e.enabled <= @timestamp將起作用),但是如果其最左側的索引屬性是不相等比較(例如e.path >= @lower && e.path <= @upper@e.enabled <= @timestamp),則不會看其進一步的索引屬性,因爲它會產生一個非連續的範圍。

還有在disabled上創建跳過列表索引的選項。這使得優化器可以在部分e.enabled <= @timestamp && (e.disabled == null || @timestamp < e.disabled)上使用該索引。它可以將其轉換爲e.disabled == null || @timestamp < e.disabled,但這看起來不太有選擇性。

總之:對於特定的查詢似乎沒有好的索引選擇。如果您可以以某種方式將STARTS WITH更改爲平等比較,那麼您可以在pathenabled上創建一個組合的跳過列表索引,並且它可能會相當有選擇性。 如果您的STARTS WITH前綴始終大小相同,則可能需要將前綴保存在一個額外的屬性中,該屬性可以被索引而不是原始值,並且可以使用相等比較來查詢:e.pathPrefix == @prefix && e.enabled <= @timestamp。 這需要爲每個文檔保存和維護額外的前綴屬性,但是在啓用更具選擇性的索引時可能值得它。

+0

非常感謝您提供這樣詳細的答案!我想我會更多地修改模式,或許我可以想出更方便的東西。 – tkroman

+0

您能否將答案標記爲已接受?或者你仍然錯過一些信息? – dothebart