我有一个联系人列表应用程序,使用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答案 0 :(得分:2)
您正在进行不区分大小写的正则表达式搜索。这几乎肯定会绕过您定义的任何索引。一种选择是将您的字段存储两次,使用一个复制力大写/小写,然后对此进行正则表达式查询。启动查询仍然可以使用索引,但如果忽略这种情况则不会。