假设我在东方数据库中具有以下顶点列表(通过边连接):
[t=1] --> [t=2] --> [t=3] --> [t=4] --> [t=5] --> [t=6] --> [t=7]
每个顶点都有一个时间戳记t。我现在想接收给定日期之前的最后一个顶点。例如:给我t = 5之前的最后一个顶点,即t = 4。
当前,我正在使用以下查询来执行此操作:
SELECT FROM ANYVERTEX WHERE t < 5 ORDER BY t DESC LIMIT 1
当最多有1000个元素时,这很好用,但是该查询的性能随列表中插入的元素数量而下降。我已经尝试过使用索引来改善整体性能,但是问题是,随着元素数量的增加,性能下降仍然存在。
答案 0 :(得分:1)
构建查询时,请始终尝试使用有关查询中关系的信息来提高性能。在这种情况下,您不需要排序(这是一项昂贵的操作),因为您知道您需要的顶点具有该顶点的输入边,因此您可以在查询中简单地使用该信息。
例如,假设我具有以下设置:
CREATE CLASS T EXTENDS V
CREATE VERTEX T SET t = 1
CREATE VERTEX T SET t = 2
CREATE VERTEX T SET t = 3
CREATE VERTEX T SET t = 4
CREATE VERTEX T SET t = 5
CREATE CLASS link EXTENDS E
CREATE EDGE link FROM (SELECT * FROM T WHERE t = 1) TO (SELECT * FROM T WHERE t = 2)
CREATE EDGE link FROM (SELECT * FROM T WHERE t = 2) TO (SELECT * FROM T WHERE t = 3)
CREATE EDGE link FROM (SELECT * FROM T WHERE t = 3) TO (SELECT * FROM T WHERE t = 4)
CREATE EDGE link FROM (SELECT * FROM T WHERE t = 4) TO (SELECT * FROM T WHERE t = 5)
然后我可以这样选择任何T
之前的顶点:
SELECT expand(in('link')) FROM T WHERE t = 2
此查询执行以下操作:
T
中选择顶点,其中t=2
link
的传入边缘expand()
边缘所来自的顶点以获取其所有信息结果正是您想要的:
这应该提供更好的性能(尤其是如果在顶点的属性t
上添加索引),因为您正在使用事先了解的有关关系的所有信息=需要的节点具有优势您选择的节点。
希望对您有帮助。