使用遍历的 Orientdb 计数性能
Orientdb performance of count with traverse use
我有一个数据库,其中包含大约 300,000 个用户以及这些用户之间的 800,000 个关系,这些数据可以这样描述:
用户 - 联系人 -> 用户
我想知道特定用户可能拥有的新联系人的数量,所以我写了这个查询来知道这个数量:
SELECT COUNT(*) FROM (TRAVERSE OUT() FROM (SELECT FROM Usuario WHERE user_id=12345) WHILE $depth <=2) WHERE $depth = 2
查询需要 5 秒(或多或少)。我将相同的数据存入 neo4j 数据库,相同级别的计数需要 450 毫秒。所以我想知道是否存在以最佳性能获取此信息(可能的新联系人数量)的方法。
通过将 NOTUNIQUE_HASH_INDEX 字段 user_id.
放入一个很好的改进
编辑 1
另一个提示,您可以尝试使用 'maxdepth' 而不是 'while depth <= 2.
SELECT COUNT (*) FROM (TRAVERSE OUT () FROM (SELECT FROM Usuario WHERE user_id = 12345) WHILE $ MAXDEPTH = 2) WHERE $ depth = 2
计算时间略有不同,因为while $depth也会在level 3进行评估,然后记录因为不匹配while而被跳过,但是在同时它们被加载,这会花费执行时间。使用 maxdepth,您只需在第 2 级停止执行。
我有一个数据库,其中包含大约 300,000 个用户以及这些用户之间的 800,000 个关系,这些数据可以这样描述:
用户 - 联系人 -> 用户
我想知道特定用户可能拥有的新联系人的数量,所以我写了这个查询来知道这个数量:
SELECT COUNT(*) FROM (TRAVERSE OUT() FROM (SELECT FROM Usuario WHERE user_id=12345) WHILE $depth <=2) WHERE $depth = 2
查询需要 5 秒(或多或少)。我将相同的数据存入 neo4j 数据库,相同级别的计数需要 450 毫秒。所以我想知道是否存在以最佳性能获取此信息(可能的新联系人数量)的方法。
通过将 NOTUNIQUE_HASH_INDEX 字段 user_id.
放入一个很好的改进编辑 1
另一个提示,您可以尝试使用 'maxdepth' 而不是 'while depth <= 2.
SELECT COUNT (*) FROM (TRAVERSE OUT () FROM (SELECT FROM Usuario WHERE user_id = 12345) WHILE $ MAXDEPTH = 2) WHERE $ depth = 2
计算时间略有不同,因为while $depth也会在level 3进行评估,然后记录因为不匹配while而被跳过,但是在同时它们被加载,这会花费执行时间。使用 maxdepth,您只需在第 2 级停止执行。