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 中的嵌入式列表查询性能的主要内容,如果未能解决你的问题,请参考以下文章