MongoDB查询性能问题

时间:2013-12-17 14:47:49

标签: java performance mongodb

我有一个联系人列表应用程序,使用mongoDB存储联系人和java驱动程序以与数据库连接。每个联系人都是自己的文档,其中包含许多字段,包括GivenName,Surname和MiddleInitial。

我最近添加了150,000个额外的联系人,这会降低性能。我为Surname / GivenName / MiddleInitial(用于按姓氏排序和搜索)添加了一个索引,为GivenName添加了一个索引(用于按GivenName搜索)。除少数情况外,这在很大程度上有所帮助。所有搜索都是锚定到字符串开头的正则表达式(例如^ Ale。*)。

按名字搜索时,以q,u,x或z开头的查询执行速度明显慢于其他任何字母;按姓氏搜索越慢,第一个字母越接近z。我还没有找到任何其他此类问题的例子。任何帮助表示赞赏。

编辑:

以下是索引:

collection.ensureIndex(new BasicDBObject("Surname",1).append("GivenName",1).append("MiddleInitial",1));
collection.ensureIndex(new BasicDBObject("GivenName", 1));

和查询:

BasicDBObject contactInfo = new BasicDBObject("GivenName", new BasicDBObject("$regex", "(?i)^al.*"); //GivenName may be Surname, al is just an example query

DBCursor cursor = collection.find(contactInfo).sort(new BasicDBObject("Surname",1).append("GivenName", 1).append("MiddleInitial", 1));

在GivenName are here

上解释结果a-z

在没有排序are here

的GivenName上解释结果a-z

1 个答案:

答案 0 :(得分:2)

您正在进行不区分大小写的正则表达式搜索。这几乎肯定会绕过您定义的任何索引。一种选择是将您的字段存储两次,使用一个复制力大写/小写,然后对此进行正则表达式查询。启动查询仍然可以使用索引,但如果忽略这种情况则不会。