高效地对电子邮件集合进行索引,以按电子邮件域进行排序和过滤

节俭TPH

我正在使用猫鼬(Mongoose)来保存电子邮件地址的中央集合,并且我还为用户和组织提供了集合。在我的应用程序中,我通过(已验证的)电子邮件域将用户与组织相关联。例如,Acme Ltd拥有acme.com和acme.co.uk域,通过使用这些域从所有电子邮件中进行选择,我可以整理一个唯一的关联用户列表。

用户可以有多个电子邮件地址(1个主电子邮件+多个辅助电子邮件)。用户无法共享电子邮件地址(因此,“ verifiedBy”字段将在用户和电子邮件之间建立一对一关系)。

我的架构(当前)如下:

const emailSchema = new Schema({
    _id: { 
        type: String,
        get: function idReverse(_id) { if(_id) return _id.split("@").reverse().join("@"); },
        set: (str) => { str.trim().toLowerCase().split("@").reverse().join("@") }
    },
    verifiedBy: { type: String, ref: 'User' }
}, options );

我的问题是,是否值得在setter中逆转电子邮件地址的域部分,并在getter中逆转它们(如我所示),以使_id上的基础MongoDb索引可以提高性能并使其更易于处理我描述过的各种查询?

我已经考虑过的替代方法是:

  • 按原样存储电子邮件,并使用正则表达式按域部分选择用户(对我来说处理起来很昂贵)
  • 将域部分存储在一个单独的字段中并对其进行索引(因为要有两个索引以及重复的数据存储,所以会很昂贵)
拉多斯瓦夫·米尔尼克

第一个选项实际上应该可以很好地工作。根据$regex文档

[...]如果正则表达式是“前缀表达式”,则可能会发生进一步的优化,这意味着所有潜在的匹配都以相同的字符串开头。[...]

如果正则表达式以尖号(^)或左锚(\ A)开头,后跟一串简单符号,则为“前缀表达式”。[...]


实验

让我们检查一下它在包含约80万个文档的集合中如何工作,其中约25%的文档包含电子邮件。分析的示例查询为{email: /^gmail/}

没有索引:

db.users.find({email: /^gmail/}).explain('executionStats').executionStats
// ...
//    "nReturned" : 2208,
//    "executionTimeMillis" : 250,
//    "totalKeysExamined" : 0,
//    "totalDocsExamined" : 202720,
// ...

带有{email: 1}索引:

db.users.find({email: /^gmail/}).explain('executionStats').executionStats
// ...
//    "nReturned" : 2208,
//    "executionTimeMillis" : 5,
//    "totalKeysExamined" : 2209,
//    "totalDocsExamined" : 2208,
// ...

如我们所见,它在执行时间和经过检查的文档方面绝对有帮助(更多的经过检查的文档可能意味着更多的IO工作)。让我们来看看它是如何工作的,如果我们将忽略前缀和更直接地使用查询:{email: /gmail/}

没有索引:

db.users.find({email: /gmail/}).explain('executionStats').executionStats
// ...
//    "nReturned" : 2217,
//    "executionTimeMillis" : 327,
//    "totalKeysExamined" : 0,
//    "totalDocsExamined" : 202720,
// ...

带有{email: 1}索引:

db.users.find({email: /gmail/}).explain('executionStats').executionStats
// ...
//    "nReturned" : 2217,
//    "executionTimeMillis" : 210,
//    "totalKeysExamined" : 200616,
//    "totalDocsExamined" : 2217,
// ...

最后,索引有很大帮助,特别是在执行前缀查询时。前缀查询看起来足够快,可以在单个字段中保持原样。一个单独的字段可能会更好地利用索引(使用它!),但是我认为5ms足够了。

与往常一样,我强烈建议您对数据进行测试并查看其性能,因为数据特征可能会影响性能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PHP:按域对电子邮件进行排序

来自分类Dev

按电子邮件域对数组中的数据进行排序和回显

来自分类Dev

按电子邮件域对数组中的数据进行排序和回显

来自分类Dev

PHP:按域对电子邮件排序

来自分类Dev

按每个电子邮件的首次出现对电子邮件:通过列表进行排序

来自分类Dev

如何按域过滤电子邮件列表并在JavaScript中进行计数?

来自分类Dev

BASH:按域对电子邮件地址列表进行排序

来自分类Dev

在WooCommerce订单和电子邮件通知上按名称对费用进行排序

来自分类Dev

如何发送具有不同域的gitlab电子邮件进行后缀,SMTP和邮件中继

来自分类Dev

使用名称和电子邮件进行Rails电子邮件验证

来自分类Dev

kendo对电子邮件字段进行网格过滤

来自分类Dev

Outlook根据首字母对电子邮件进行排序

来自分类Dev

如何对基于旧.pst文件的电子邮件进行排序?

来自分类Dev

使用角度过滤器对电子邮件ID进行排序

来自分类Dev

设置综合电子邮件以进行测试

来自分类Dev

使用JavaScript进行电子邮件验证

来自分类Dev

如何对收到的电子邮件进行分类

来自分类Dev

从HTML表单进行PHP电子邮件验证和检索

来自分类Dev

使用PHP和SMTP进行电子邮件登录检查

来自分类Dev

电子邮件地址验证与发送邮件进行激活?

来自分类Dev

按时间排序电子邮件(按Mutt排序)

来自分类Dev

如何按域对电子邮件进行分组,合并和汇总目录中的所有文件?

来自分类Dev

正则表达式-验证电子邮件域和完整电子邮件

来自分类Dev

如何按电子邮件地址域订购查询?

来自分类Dev

将电子邮件重定向到默认电子邮件地址以进行测试

来自分类Dev

将电子邮件重定向到默认电子邮件地址以进行测试

来自分类Dev

使用电子邮件内容 php 中的按钮进行电子邮件验证

来自分类Dev

如何在Outlook中按发件人的电子邮件地址而不是显示名称进行排序?

来自分类Dev

PHP数组-按电子邮件地址域排序(备用)

Related 相关文章

  1. 1

    PHP:按域对电子邮件进行排序

  2. 2

    按电子邮件域对数组中的数据进行排序和回显

  3. 3

    按电子邮件域对数组中的数据进行排序和回显

  4. 4

    PHP:按域对电子邮件排序

  5. 5

    按每个电子邮件的首次出现对电子邮件:通过列表进行排序

  6. 6

    如何按域过滤电子邮件列表并在JavaScript中进行计数?

  7. 7

    BASH:按域对电子邮件地址列表进行排序

  8. 8

    在WooCommerce订单和电子邮件通知上按名称对费用进行排序

  9. 9

    如何发送具有不同域的gitlab电子邮件进行后缀,SMTP和邮件中继

  10. 10

    使用名称和电子邮件进行Rails电子邮件验证

  11. 11

    kendo对电子邮件字段进行网格过滤

  12. 12

    Outlook根据首字母对电子邮件进行排序

  13. 13

    如何对基于旧.pst文件的电子邮件进行排序?

  14. 14

    使用角度过滤器对电子邮件ID进行排序

  15. 15

    设置综合电子邮件以进行测试

  16. 16

    使用JavaScript进行电子邮件验证

  17. 17

    如何对收到的电子邮件进行分类

  18. 18

    从HTML表单进行PHP电子邮件验证和检索

  19. 19

    使用PHP和SMTP进行电子邮件登录检查

  20. 20

    电子邮件地址验证与发送邮件进行激活?

  21. 21

    按时间排序电子邮件(按Mutt排序)

  22. 22

    如何按域对电子邮件进行分组,合并和汇总目录中的所有文件?

  23. 23

    正则表达式-验证电子邮件域和完整电子邮件

  24. 24

    如何按电子邮件地址域订购查询?

  25. 25

    将电子邮件重定向到默认电子邮件地址以进行测试

  26. 26

    将电子邮件重定向到默认电子邮件地址以进行测试

  27. 27

    使用电子邮件内容 php 中的按钮进行电子邮件验证

  28. 28

    如何在Outlook中按发件人的电子邮件地址而不是显示名称进行排序?

  29. 29

    PHP数组-按电子邮件地址域排序(备用)

热门标签

归档