我有一个联系人列表应用程序,该应用程序使用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));
结果解释AZ上给定名称的位置
解释的结果对给定名称AZ排序没有在这里
您正在执行不区分大小写的正则表达式搜索。几乎可以肯定,这将绕过您定义的所有索引。一种选择是使用一种将大小写复制到大写/小写的方式来存储字段两次,然后对它进行正则表达式查询。开始查询仍然可以使用索引,但是如果您忽略这种情况,则不能使用索引。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句