首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongodb索引用户定义模式

问mongodb索引用户定义模式
EN

Stack Overflow用户
提问于 2014-01-30 02:43:16
回答 2查看 291关注 0票数 0

我们目前正在使用MongoDB来允许SaaS应用程序中的租户定义他们可以在应用程序中使用的实体。我们不知道每个租户将如何为他们预先创建的实体定义字段。每个实体将在一个属于租户的单独数据库中为其动态创建一个集合。

例如,一个租户可能将客户定义为姓名、姓氏、电子邮件。另一位租户可以将装运定义为发运参考、装运日期、船东等.每个租户的租户数据库中都有许多实体/集合。

我们有一个字段(ID),我们总是强迫用户将其包含在每个实体/集合中。在创建集合时,我们将预先对该字段进行索引。

但是,当数据集变得太大时,我们如何处理希望允许租户对大型集合/实体进行排序/搜索/订单/查询的情况?

也就是说,由于我们不知道用户将对哪些字段进行排序/筛选/排序,那么在本例中使用什么索引策略呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-30 04:00:00

首先,Mongo要求每个文档都有_id,并且它会自动对其进行索引。您应该利用这一点,而不是创建另一个ID字段,以防需要客户端拥有ID字段。我不确定你的申请中是否有这种情况。

您所要求的不可能有一个完美的解决方案,甚至是最理想的解决方案,但我可以建议以下几个选项:

  • 为文档中的每个字段创建单个字段索引。让Mongo查询优化器根据查询来决定使用哪个索引。缺点-占用磁盘和内存的大量空间。使插入变慢。Mongo只能在条件子句中使用一个索引,因此不能使用复合索引。您可以使用像这这样的工具轻松地提取模式。我写了这个小原型来分析和打印蒙戈模式。
  • 让应用程序了解要创建哪些索引。从Mongo分析器获得缓慢的查询(在Mongo日志中),分析公共部分(自动?)并为最常用的字段创建索引。这并不容易实现,如果客户端更改查询或数据,效率可能会随着时间的推移而改变。应用程序在开始时会很慢,直到它了解了自己:)。
票数 0
EN

Stack Overflow用户

发布于 2014-01-30 06:31:17

只想强调在选择您的设计时,您提到的ID而不是_id字段实际上是一些唯一的实体标识符,那么最好将其放在_id中。

这里的原因是,在所需的_id上使用另一个唯一索引的性能权衡是相当大的开销。考虑到这一点,因为_id是必需的,所以在确定使用哪个索引时,MongoDB首先要寻找的东西。否则,考虑一个包含实体信息和其他有用的唯一性的复合_id字段。

至于用户定义的字段(这是mongo文档的本质),为了我的钱,我会将它作为API的一部分,根据需要设置索引。根据正在进行的搜索类型,您可能需要复合索引和生成的查询,这些索引和查询对这些索引和查询都有意义。

简单地索引每个字段可能会有有限的用途,因为无论如何只会为查找选择一个索引,而查询优化器将尝试所有这些索引。如前所述,一个很长的选项可以是根据使用模式设置索引。但这可能需要做些工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21446824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档