OrientDB GraphED - 可以自定义记录标识符吗?搜索 150 万条记录非常慢

Posted

技术标签:

【中文标题】OrientDB GraphED - 可以自定义记录标识符吗?搜索 150 万条记录非常慢【英文标题】:OrientDB GraphED - is custom record identifier possible? search is very slow for 1.5M records 【发布时间】:2012-06-06 20:53:19 【问题描述】:

Orient 版本:官方分发 OrientDB Graph Edition 1.0.1

我正在尝试使用 OrientDB SQL 插入构建蓝图兼容图(比 g.addVertex 更快,并且没有 OutOfMemory 错误)。

创建 150 万条记录时,通过控制台(批处理)插入的时间比预期的要长(在四核 i7 上为 13 分钟),并且通过“名称”字段搜索非常慢(2 分钟)。

出于测试目的,我们有一个非常简单的导入 sql 文件,它尝试创建与两个设置参数 name:account_id 和 type:account_type 以及空输入/输出数组兼容的蓝图顶点。

import.ornt:

connect local:/graph1/databases/dbdemo admin admin;
drop database;
create database local:/graph1/databases/dbdemo admin admin local graph;
insert into V (name,type,in,out) values ("1111111","player",[],[]);
...
disconnect;

注意:最好能够将记录标识符设置为我们预先存在的 account_id。但我不确定如何尝试。

上面的 sql 最终约为 100MB,我通过控制台运行它(console.sh 包含优化 -Dmvrbtree.optimizeThreshold=-1):

:$ ./console.sh import.ornt 
OrientDB console v.1.0.1 (build @BUILD@) www.orientechnologies.com
Type 'help' to display all the commands supported.

Installing extensions for GREMLIN language v.2.0.0-SNAPSHOT
Connecting to database [local:/graph1/databases/dbdemo] with user 'admin'...OK

Database 'dbdemo' deleted successfully
Creating database [local:/graph1/databases/dbdemo] using the storage type [local]...
Database created successfully.

Current database is: local:/graph1/databases/dbdemo

Inserted record 'V#6:0name:11111111,type:player,in:[0],out:[0] v0' in 0.002000 sec(s).
...
Disconnecting from the database [dbdemo]...OK

此时,我们已经有了带有大约 150 万个顶点的 OGraphVertex 类的基本 OrientDB 图。

orientdb> classes 

CLASSES:
----------------------------------------------+---------------------+-----------+
 NAME                                         | CLUSTERS            | RECORDS   |
----------------------------------------------+---------------------+-----------+
 ORIDs                                        | 5                   |         0 |
 OGraphEdge                                   | 7                   |         0 |
 OUser                                        | 4                   |         3 |
 ORole                                        | 3                   |         3 |
 OGraphVertex                                 | 6                   |   1524528 |
----------------------------------------------+---------------------+-----------+
 TOTAL                                                                  1524534 |
--------------------------------------------------------------------------------+

使用控制台,通过 Orient SQL 或 Gremlin/Pipes 进行选择需要很长时间:

orientdb> gremlin g.V.has('name','1149400');                      

v[#6:617363]

Script executed in 129.809006 sec(s).
> select from OGraphVertex where name like '1149400';

---+---------+--------------------+--------------------+--------------------+--------------------
  #| RID     |name                |type                |in                  |out                 
---+---------+--------------------+--------------------+--------------------+--------------------
  0|#6:617363|1149400             |player              |[0]                 |[0]                 
---+---------+--------------------+--------------------+--------------------+--------------------

1 item(s) found. Query executed in 112.531 sec(s).

orientdb> 

使用 OrientDB SQL 或 Gremlin 大约需要 2 分钟!

作为一种潜在的解决方法,最好将记录标识符设置为来自 mysql 数据库源的原始帐户 ID。是否可以有自定义记录 ID?

例如,由于我们会在开始遍历时知道 account_id(例如 1149400),因此理想的情况是:

orientdb> gremlin g.v('#6:1149400').map

name=1149400, type=player

Script executed in 0.054000 sec(s).

0.054000 比 112.531 快很多!!

【问题讨论】:

【参考方案1】:

OrientDB RecordId 无法更改,但您可以针对 V.name 属性创建索引。示例:

创建索引 OGraphVertex.name NOTUNIQUE

甚至:

CREATE INDEX V_name ON OGraphVertex (name) notunique;

欲了解更多信息,请查看:OrientDB Indexes

【讨论】:

太棒了。我只需要创建属性(CREATE PROPERTY OGraphVertex.name STRING;)然后创建索引(CREATE INDEX name ON OGraphVertex (name) UNIQUE;),然后查找是SELECT FROM index:name WHERE key = '1149400',它在0.281 sec(s).中产生了一个结果

以上是关于OrientDB GraphED - 可以自定义记录标识符吗?搜索 150 万条记录非常慢的主要内容,如果未能解决你的问题,请参考以下文章

android自定义View之钟表诞生记

OrientDB 删除网络 BigData

架构师成长记_第八周_05_mappings 自定义创建映射

android自定义View之NotePad出鞘记

OrientDb - 使用图形从多个顶点中选择

OrientDB for ETL(Kettle)