我在一个相当大的数据存储上遇到了一些性能问题。 为了优化插入阶段,我们创建了一个文档存储而不是图形,实际上边缘创建性能太慢了。 基本上现在我们有一个A类(有大约30M文件),有一个链接(比如字段fieldL)到B类(大约500个文件)。 查询结构如下:
从A中选择field1 =' field1value'和field2 =' field2value'和field3> 0 ...和fieldL in(从B中选择......)
我发现的第一个问题是: 我在参与where条件的n个属性上创建了n个索引,但是explain命令显示我只使用了一个... https://github.com/orientechnologies/orientdb/issues/3626 所以我创建了一个复合索引,如果我执行只涉及索引的查询,请说
从A中选择field1 =' field1value'和field2 =' field2value'和field3> 0 结果非常快
问题是关于查询的第二部分,涉及fieldL和链接。 我已尝试使用[#rid,...]语法,但似乎表现不佳。
我还尝试使用不同的方法更改架构:B类带有多个指向A类的链接,使用不同的查询模式(比如包含链接fieldL1的字段):
select * from(从B中选择展开(fieldL1)......)其中field1 =' field1value'和field2 =' field2value'和field3> 0
在这种情况下,子查询执行一种数据分区,但不幸的是我们丢失了结果集上的索引,所以我们在第二个where子句上的表现非常慢(field1 =' field1value'和field2 =' field2value' field3> 0)。
我的问题是:更快的执行这类查询是否存在更好的查询模式?
非常感谢。
顺便说一下,在性能调优过程中,执行查询中涉及的文档计数似乎很尴尬。 (https://github.com/orientechnologies/orientdb/issues/3462)
答案 0 :(得分:0)
如果您使用以下查询
select * from (select expand(fieldL1) from B where ...) where field1='field1value' and field2='field2value' and field3>0
它没有使用索引,因为在使用子查询和索引时似乎存在问题
有关详细信息,请查看此链接 https://groups.google.com/forum/#!topic/orient-database/7jWEGpkIzXQ