例如,我的文档只有三个字段:用户,日期,状态。由于我按用户选择并按日期排序,因此我将这两个字段作为索引。这是正确的做法。但是,由于每个日期只有一个状态,因此我基本上将所有内容编入索引。可以不索引查询中的所有字段吗?你在哪里划线?
使这个问题变得更加困难的原因是读取重写和重写集合之间的索引完全相反。如果你的介于两者之间,那么在索引方面如何确定正确的方法呢?
答案 0 :(得分:1)
是否可以不对查询中的所有字段编制索引?
是的,但是对于经常使用的查询,您需要避免这种情况。任何未编入索引的内容都意味着“桌面扫描”。这意味着单独访问每个可能的文档,这将是缓慢的。
你在哪里划线?
另请注意,如果您按非索引字段排序,如果您尝试对太多数据进行排序,MongoDB会“大喊大叫”。因此,您必须了解有多少数据“在索引之外”。
如果你的介于两者之间,你如何确定索引的正确方法?
监测,仪器,实验和经验。
这里没有严格的规则,所有这些都将取决于权衡。 CPU与RAM对磁盘IO与响应性等
答案 1 :(得分:1)
完美的情况是将所有内容存储在一个索引中。我所说的一切都是你查询的所有字段,你排序并检索。这将确保您获得最大性能(如果索引符合ram) 这种情况并非总是可行,因此您必须做出选择。
以下是最多减少索引大小的3个提示:
您的每个查询都有很多结果或只有少数几个? =>一些:你不必索引你检索的所有字段(只有查询和排序字段,因为很少有结果意味着很少的磁盘访问)。
您的查询结果是否经常相同(即您的工作集很小)? =>不要索引您检索的字段,因为结果是由mongodb缓存的。
您的查询字段是否比另一个更具选择性? =>索引更具选择性的字段。