我们目前正在使用MongoDB来允许SaaS应用程序中的租户定义他们可以在应用程序中使用的实体。我们不知道每个租户将如何为他们预先创建的实体定义字段。每个实体将在一个属于租户的单独数据库中为其动态创建一个集合。
例如,一个租户可能将客户定义为姓名、姓氏、电子邮件。另一位租户可以将装运定义为发运参考、装运日期、船东等.每个租户的租户数据库中都有许多实体/集合。
我们有一个字段(ID),我们总是强迫用户将其包含在每个实体/集合中。在创建集合时,我们将预先对该字段进行索引。
但是,当数据集变得太大时,我们如何处理希望允许租户对大型集合/实体进行排序/搜索/订单/查询的情况?
也就是说,由于我们不知道用户将对哪些字段进行排序/筛选/排序,那么在本例中使用什么索引策略呢?
发布于 2014-01-30 04:00:00
首先,Mongo要求每个文档都有_id,并且它会自动对其进行索引。您应该利用这一点,而不是创建另一个ID字段,以防需要客户端拥有ID字段。我不确定你的申请中是否有这种情况。
您所要求的不可能有一个完美的解决方案,甚至是最理想的解决方案,但我可以建议以下几个选项:
发布于 2014-01-30 06:31:17
只想强调在选择您的设计时,您提到的ID而不是_id字段实际上是一些唯一的实体标识符,那么最好将其放在_id中。
这里的原因是,在所需的_id上使用另一个唯一索引的性能权衡是相当大的开销。考虑到这一点,因为_id是必需的,所以在确定使用哪个索引时,MongoDB首先要寻找的东西。否则,考虑一个包含实体信息和其他有用的唯一性的复合_id字段。
至于用户定义的字段(这是mongo文档的本质),为了我的钱,我会将它作为API的一部分,根据需要设置索引。根据正在进行的搜索类型,您可能需要复合索引和生成的查询,这些索引和查询对这些索引和查询都有意义。
简单地索引每个字段可能会有有限的用途,因为无论如何只会为查找选择一个索引,而查询优化器将尝试所有这些索引。如前所述,一个很长的选项可以是根据使用模式设置索引。但这可能需要做些工作。
https://stackoverflow.com/questions/21446824
复制相似问题