Gremlin查询性能优化求助:带type条件的查询耗时过高
Gremlin查询性能优化方案
针对查询性能差异问题,结合profile结果分析,给出以下优化方法:
问题根源
第一个查询中JanusGraph选择byTypeMixed索引先匹配type=1,返回了16538条数据,后续再与receiver=3145912的结果做交集,大结果集的交集操作导致响应时间过长;而第二个查询直接使用byReceiverMixed索引,仅返回95条数据,因此速度极快。
优化方法
1. 创建联合混合索引
将receiver和type纳入同一个混合索引,让JanusGraph直接通过联合索引匹配两个条件,避免大结果集交集操作:
// 获取图管理实例 mgmt = graph.openManagement() // 定位属性键 receiverKey = mgmt.getPropertyKey('receiver') typeKey = mgmt.getPropertyKey('type') // 构建联合混合索引 mgmt.buildIndex('byReceiverAndTypeMixed', Vertex.class) .addKey(receiverKey) .addKey(typeKey) .buildMixedIndex('search') // 提交索引创建 mgmt.commit() // 对现有数据重新索引(仅针对已有数据场景) graph.tx().rollback() mgmt = graph.openManagement() mgmt.updateIndex(mgmt.getGraphIndex('byReceiverAndTypeMixed'), SchemaAction.REINDEX).get() mgmt.commit()
创建完成后,原查询会自动使用该联合索引,直接返回匹配双条件的结果,大幅缩短响应时间。
2. 强制指定索引查询
若暂时无法创建新索引,可强制查询优先使用byReceiverMixed索引,先获取小结果集再过滤type条件:
g.V().has('receiver','3145912').has('type','1').with('index','byReceiverMixed')
该方式先通过byReceiverMixed获取95条数据,再在内存中过滤type=1的记录,内存过滤耗时极低,响应时间会接近仅查询receiver的3ms水平。
3. 调整索引选择策略
检查JanusGraph索引配置,确保基数更低的属性(如receiver,结果集更小)被优先作为索引入口。可通过调整索引权重,或调整查询条件顺序,引导优化器选择高效索引。
内容的提问来源于stack exchange,提问作者Hari Krishnan Ramachandran
相关产品推荐
相关产品推荐

