我有以下课程:
@Indexes({@Index("threadOrder,linf"),
@Index("messageId,linf"),
@Index("from, date"),
@Index("linf,date")})
@Entity(noClassnameStored = true)
public class MessageEntry {
@Id
public ObjectId id;
@Reference
public MailSourceFile mailSourceFile;
@Reference
public Email from;
@Reference
public Linf linf;
// some other primitive fields here
}
其中MailSourceFile有一些其他嵌套的@ Reference,电子邮件和Linf没有。问题是即使通过触摸命令将集合加载到存储器中,有时查询也需要很长时间(> 100ms)。我需要这个时间减少,我相信这是可能的。所有的权利都到位了。我有17M MessageEntry文档。慢查询看起来像这样:
ds.createQuery(MessageEntry.class).field("linf").equal(linf)
.field("threadOrder").in(threadOrders).asList();
通常在threadOrders数组中有~15个整数。我的猜测是,缓慢是由嵌套的DBRefs引起的,每次执行此请求时都会产生额外的查询。谁正在加载这些对象:morphia,mongo或java驱动程序?我可以以某种方式避免这些要求吗?可能还有其他事情可以改善此请求的性能吗?感谢名单。
答案 0 :(得分:1)
Morphia在将文档反序列化回java对象时加载这些引用。默认情况下,它会急切地这样做。您可以通过在lazy=true
注释上设置@Reference
来告诉morphia进行延迟提取,然后您将获得对象的代理版本,该版本会根据需要懒散地获取这些引用。
答案 1 :(得分:0)
此外,启用慢速查询记录db.setProfilingLevel(1)
(请参阅http://docs.mongodb.org/manual/reference/method/db.setProfilingLevel/)以查看基础查询是什么,并从那里开始跟踪您的问题。但是,evanchooly的方法肯定会有所帮助。