OrientDB:查询速度慢,需要帮助创建索引才能加快速度

时间:2016-04-29 15:03:20

标签: sql indexing orientdb

我使用SQL查询从我的OrientDB数据库中检索货币交易(v2.1.16)

查询运行缓慢,我想知道如何创建可加快速度的索引。

查询是:

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字段,以及在一个顶点内找到的registerType字段。 EMBEDDEDMAP字段。

您可以创建哪个索引来加速此查询?或者你将如何重写这个查询?

我的结构如下:

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

重要字段:

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

我现在提取的帐户附加了约500个MoneyTransaction顶点。

1 个答案:

答案 0 :(得分:1)

关于索引选择,它取决于数据集的数量:

  • 如果数据集不是很大,您可以使用 SB-TREE 索引,因为它们维护排序并允许范围操作;
  • 如果数据集非常大,您可以使用 HASH INDEX ,这对大数字更有用,并且比其他索引消耗更少的资源,但它不支持范围操作

在您的情况下,您可以在 SB-TREE UNIQUE INDEX 上创建 accountId (例如 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 记录(通过使用之前创建的索引),然后您只能检索已连接的 {{1 记录。

您可以在OrientDB official documentation中找到有关索引的更多详细信息。

另一种方式,基于您指定 MoneyTransaction 类不包含重要数据(如果我已经很好理解)的事实,可能是要更改结构搜索更直接。 E.g:

<强>之前:

enter image description here

之后(我之前创建了一个新的 MoneyProfile 边缘类):

enter image description here

希望有所帮助