OrientDB 中的嵌入式列表查询性能

Posted

技术标签:

【中文标题】OrientDB 中的嵌入式列表查询性能【英文标题】:Embedded List Query Performance In OrientDB 【发布时间】:2014-05-18 18:11:41 【问题描述】:

也许这是一个关于OrientDB的非常简单的问题,因为我才用了几天。

我的问题是,我在 OrientDB 中有大约一百万个文档(我们称之为 ClassA),每个文档都有一个字段(我们称之为 fieldA)。

fieldA的类型为内嵌列表,内嵌列表中的项为字符串。

所以,OrientDB 中的数据是这样的:

[
    
        fieldA: ['a','b','c']
    ,
    
        fieldA: ['c','d','e']
    ,
]

我要做的是通过fieldA查询文档。

所以查询是这样的:

select from ClassA where 'c' in fieldA

因为数据库中有几百万条记录,所以我为fieldA创建了一个Index,创建索引的脚本是这样的:

create index ClassA.fieldA not unique

但是当我解释选择查询时,我得到了这个:


    "@type":"d","@version":0,
     "involvedIndexes":["ClassA.fieldA"],
     "current":"#11:960477",
     "fetchingFromTargetElapsed":160596,
     "documentReads":959211,
     "documentAnalyzedCompatibleClass":959211,
     "recordReads":959211,
     "elapsed":160596.25,
     "resultType":"collection",
     "resultSize":1,
     "@fieldTypes":"involvedIndexes=e,fetchingFromTargetElapsed=l,documentReads=l,documentAnalyzedCompatibleClass=l,recordReads=l,elapsed=f"
 

从结果中可以看到,即使它使用了索引["ClassA.fieldA"],但是对于 959211 条记录,查询持续了 160596 毫秒,大约 16 秒。太慢了(和mysql相比,mysql的记录更大,因为mysql不支持内嵌list,所以mysql的存储就是对于每一个fieldA,在mysql中都有一条记录,查询很速度快,仅需 0.015 秒)。

我做错了吗?还是OrientDB中嵌入式列表查询的表现就是这样?

有人对OrientDB和OrientDB索引有深入了解吗?

【问题讨论】:

你找到解决办法了吗? 不,暂时放弃了 OrientDB。 MySQL 现在对我来说似乎是一个更好的数据库。 :D 【参考方案1】:

MySQL 通过分页在查询之后立即返回游标,但是当您获取所有记录时,结果可能会有所不同。请尝试做一个

select count(*) from ClassA where 'c' in fieldA

在 OrientDB 和 MySQL 上或尝试获取所有记录。

【讨论】:

不,这并不容易。数据库在 fieldA 中只有 1 个“c”对象。 所以 OrientDB profiler 结果显示它浏览了 959,211 条记录:索引没有被正确使用。 是的,我同意你的观点,所以这个问题就是这样,我是不是用错了索引?如果我错了,如何使用索引使这个查询快速?

以上是关于OrientDB 中的嵌入式列表查询性能的主要内容,如果未能解决你的问题,请参考以下文章

OrientDB - 将本地数据库与远程数据库同步

Mongo 正则表达式查询嵌入对象列表中的字段

在列表框中显示所有记录

OrientDB - 类名中的数字

使用聚合查询获取具有总交易计数和交易详细信息的用户列表作为嵌入文档

是否可以查询列表元素?