2016-04-29 85 views
1

我使用的是SQL查詢來從我OrientDB數據庫中獲取的金錢交易(v2.1.16)OrientDB:慢查詢,需要幫助創建索引來加快它

的查詢運行速度慢,我想知道如何創建索引來加快速度。

查詢是:

SELECT timestamp, txId 
FROM MoneyTransaction 
WHERE (
    out("MoneyTransactionAccount").in("AccountMoneyProfile")[accountId] = :accountId 
    AND moneyType = :moneyType 
    AND :registerType IN registerQuantities.keys()  
)  
ORDER BY timestamp DESC, @rid DESC 

我也有從特定點恢復時間列表中的其他變種:

SELECT timestamp, txId 
FROM MoneyTransaction 
WHERE (
    out("MoneyTransactionAccount").in("AccountMoneyProfile")[accountId] = :accountId 
    AND moneyType = :moneyType 
    AND :registerType IN registerQuantities.keys()  
) 
AND timestamp <= :cutoffTimestamp 
AND txId NOT IN :cutoffTxIds 

ORDER BY timestamp DESC, @rid DESC 

我有困難的是試圖找出如何建立具有更復雜字段的索引,即不存在於同一頂點內的accountId字段,以及要在EMBEDDEDMAP字段內找到的registerType字段。

您會創建哪個索引以加速此查詢?或者你會如何重寫這個查詢?

我的結構如下:

[Account] --> (1 to 1) AccountMoneyProfile --> [MoneyProfile] 
[MoneyTransaction] --> (n to 1) MoneyTransactionAccount --> [MoneyProfile] 

重要字段:

Account.accountId STRING 
MoneyTransaction.registerQuantities EMBEDDEDMAP 
MoneyTransaction.timestamp DATETIME 

我取,現在該帳戶連接到它約500 MoneyTransaction頂點。

+0

Hi @hbCyber​​,你可以發表一個你的結構的例子嗎?您的數據庫中有多少條記錄? – LucaS

+0

@LucaS感謝提問,我已經添加了上面的細節。 – hbCyber

+0

你好@hbCyber​​,你的類是類似於這些:'Account(accountId)','MoneyTransaction(txId,timestamp,registerQuantities,moneyType)','MoneyProfile(?)'? – LucaS

回答

1

對指數的選擇,這取決於你的數據集的數量:

  • 如果數據集不是很大,你可以因爲維持整理使用SB-TREE指數,並允許範圍內操作;
  • 如果數據集非常大,您可以使用一個大數量並且比其他索引消耗更少資源的HASH INDEX,但它不支持範圍操作。

你的情況,你可以創建,例如,上SB-TREE UNIQUE INDEXaccountId(例如Account.accountId),並在某種程度上目標的查詢索引直接匹配,因此,它重寫查詢儘可能讀取更少的記錄。例如:

SELECT timestamp, txId 
FROM (
    SELECT expand(out("AccountMoneyProfile").in("MoneyTransactionAccount")) 
    FROM Account 
    WHERE accountId = :accountId 
    ) 
WHERE moneyType = :moneyType AND :registerType IN registerQuantities.keys() 
ORDER BY timestamp DESC, @rid DESC 

這樣,你直接選擇Account記錄你正在尋找(通過使用以前創建索引),然後你只能檢索連接MoneyTransaction記錄。

您可以在OrientDB official documentation中找到有關索引的更多詳細信息。

另一種方法,根據您指定的MoneyProfile類不包含重要數據(如果我深知)的事實,可能是改變結構,以使搜索更直接。例如。:

前:

enter image description here

後(我之前已經創建了新的AccountMoneyTransaction邊緣類):

enter image description here

希望能有所幫助