如何加快使用多个字符串过滤器的查询?

我在MongoDB 3.4中有一个集合来存储来自某个应用程序的所有用户的联系人。 每个联系人都有大量的字符串字段(100+)。 我使用MongoDB,但问题适用于任何其他引擎(MySQL,弹性搜索等)

几乎所有检索联系人的查询都具有相同的四个基本条件,例如,user_id,base_field1,base_field2,base_field3,因此我创建了一个包含这些字段的复合索引以改进查询。 基本查询如下所示:

db.contacts.find({
    user_id: 1434,
    base_field1: {$in: [0, 10]},
    base_field2: true,
    base_field3: "some value"
}).limit(10)

基本查询的执行时间很好(小于2秒),但请记住有25K个联系符合基本条件。

但是,该应用程序允许用户通过任何其他字段筛选联系人,甚至可以添加任意数量的筛选器。 所有过滤器都使用包含运算符,因此查询如下所示:

db.contacts.find({
    user_id: 1434,
    base_field1: {$in: [0, 10]},
    base_field2: true,
    base_field3: "some value",
    field4: {$regex: "foobar", $options: "i"},
    field5: {$regex: "foobar", $options: "i"},
    field6: {$regex: "foobar", $options: "i"},
      .
      .
      .
}).limit(10)

因此,我们的要求执行时间不好(9-10秒)。 另外,正如您所预料的那样,增加过滤器的数量也会增加执行时间,因此:

有没有什么方法可以加快从设计和查询的角度来查询?

有没有其他数据库引擎比MongoDB更好地改善这种查询?

请在回复前考虑以下意见和限制:

  • 一个文本索引在这里没有用处,因为如果我创建一个包含所有可能字段的复合文本索引,但只有field4的用户过滤器包含“foobar”,那么结果可能包含field5中包含“foobar”的联系人。
  • 只需创建一个具有超过31个字段的复合索引在MongoDB中是不可能的。
  • 为每个字段创建一个简单的索引是没有意义的,因为当用户过滤多个字段时,MongoDB将只使用一个索引。 你也可以创建每个集合只有64个索引。
  • 实际上,我通过散列键(user_id)使用MongoDB共享集群,但为了简化起见,我将问题简化为仅包含一个碎片的范围,即使我为每个用户添加碎片也存在问题。
  • 编辑:我改变了或条件(field4或field5 ...)的条件是真实的情况。

    链接地址: http://www.djcxy.com/p/57917.html

    上一篇: How to speed up a query which use several string filters?

    下一篇: field vs single compound?