我使用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顶点。
答案 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:
<强>之前:强>
之后(我之前创建了一个新的 MoneyProfile
边缘类):
希望有所帮助