我有一个联系人列表应用程序,该应用程序使用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

说明GivenName上的结果a-z,不排序are here

最佳答案

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

07-24 19:58