Mongodb Mongo完整集合扫描是否读取集合中的每个单词?

Mongodb Mongo完整集合扫描是否读取集合中的每个单词?,mongodb,Mongodb,假设由于某些正当的原因(比如可能您将64个允许的索引设置为最大),您没有对某些内容进行索引,并且您只在某些字段中搜索值 更极端的是,假设每个对象都有一个authorName字段、bookstitles字段和bookFullText字段(收集了他们所有小说的内容) 如果没有索引,而您查找的是authorName列表,那么它是否必须通读整个集合中所有字段的所有内容,还是只读取authorName字段和其他字段的名称而不读取其他字段的内容?文档中的字段是有序的。服务器将文档存储为键值对列表。因此,我希

假设由于某些正当的原因(比如可能您将64个允许的索引设置为最大),您没有对某些内容进行索引,并且您只在某些字段中搜索值

更极端的是,假设每个对象都有一个
authorName
字段、
bookstitles
字段和
bookFullText
字段(收集了他们所有小说的内容)


如果没有索引,而您查找的是
authorName
列表,那么它是否必须通读整个集合中所有字段的所有内容,还是只读取
authorName
字段和其他字段的名称而不读取其他字段的内容?

文档中的字段是有序的。服务器将文档存储为键值对列表。因此,我希望,如果服务器正在进行集合扫描和字段比较,那么服务器将:

  • 跳过相关字段前面的所有字段,每次跳过一个字段(这要求服务器对每个字段名执行字符串比较),然后
  • 跳过特定文档中相关字段后的字段(跳转到集合中的下一个文档)。
上述情况适用于比较。从磁盘读取数据呢

我熟悉的基本数据库设计将逻辑记录(MongoDB中的文档、RDBMS中的表行)与物理页面分开。出于性能原因,数据库通常不会从磁盘读取文档,而是读取页面。因此,在我看来,数据库在将文档映射到页面时不太可能跳过某些字段我希望在需要文档的任何字段时,都能从磁盘读取整个文档。

MongoDB的16MB文档限制进一步支持了这一假设。这是相当低的,我怀疑是这样设置的,服务器可以将文档完全读取到内存中,而不用担心它们可能非常大。例如,Postgres将VARCHAR与存储数据的文本类型区分开来——VARCHAR数据以内联方式存储在表行中,而文本数据则单独存储,这大概是为了避免在需要任何列值时必须从磁盘读取数据的问题


我不是MongoDB服务器工程师,所以上面的说法可能是错误的。

文档中的字段是有序的。服务器将文档存储为键值对列表。因此,我希望,如果服务器正在进行集合扫描和字段比较,那么服务器将:

  • 跳过相关字段前面的所有字段,每次跳过一个字段(这要求服务器对每个字段名执行字符串比较),然后
  • 跳过特定文档中相关字段后的字段(跳转到集合中的下一个文档)。
上述情况适用于比较。从磁盘读取数据呢

我熟悉的基本数据库设计将逻辑记录(MongoDB中的文档、RDBMS中的表行)与物理页面分开。出于性能原因,数据库通常不会从磁盘读取文档,而是读取页面。因此,在我看来,数据库在将文档映射到页面时不太可能跳过某些字段我希望在需要文档的任何字段时,都能从磁盘读取整个文档。

MongoDB的16MB文档限制进一步支持了这一假设。这是相当低的,我怀疑是这样设置的,服务器可以将文档完全读取到内存中,而不用担心它们可能非常大。例如,Postgres将VARCHAR与存储数据的文本类型区分开来——VARCHAR数据以内联方式存储在表行中,而文本数据则单独存储,这大概是为了避免在需要任何列值时必须从磁盘读取数据的问题

我不是MongoDB服务器工程师,所以上面的说法可能是错误的

  • BSON文档以32KB的块(默认大小)以64MB的块(默认大小)存储在普通情况下(wiredTiger snappy compressed),如果您的文档压缩大小为48KB,则必须在内存中加载两个32KB的块,以便解压缩并搜索非索引字段,这是一项昂贵的操作,此外,如果您搜索多个文档,通常它们不是按顺序块编写的,这会增加后端存储对IOPS的需求,这就是为什么最好进行一些初始分析,并为您主要搜索的字段编制索引,并创建索引,索引(B-tree)非常有效,因为它们大部分时间在内存中被压缩(前缀压缩),并且字段搜索速度非常快

  • mongodb中的文本索引足以进行一些简单的文本搜索,或者您可以使用正则表达式

  • 如果你大部分时间都要进行全文搜索,你最好有像elasticsearch这样的搜索引擎,它支持数据库前面的反向索引,因为反向索引已经计算出了你的全文搜索结果,并且可以比使用标准B树索引的类似操作快几倍

  • 如果您使用ATLAS(mongodb云服务),那么已经集成了lucene引擎(反向索引),可以为您进行全文搜索

  • 我希望我的回答能对这个问题有所启发……:)

  • BSON文档以32KB的块(默认大小)以64MB的块(默认大小)存储在普通情况下(wiredTiger snappy compressed),如果您的文档压缩大小为48KB,则必须在内存中加载两个32KB的块,以便解压缩并搜索非索引字段,这是一项昂贵的操作,此外,如果搜索多个文档,它们通常不会按顺序块写入,这会增加对f的要求