我正在运行一个返回大量数据的查询。它查找916个文档,每个文档都有一个大数据字段(大约5MB)。查询看起来像这样:
db.collection.find(
{'name': somename, 'currency': mycurrency,
'valuation_date': {'$in': [list_of_250_datetime_datetime]}
}.{'data_column: is set to true or false in the below test results}).limit(x)
我一直在尝试优化查询,发现大部分时间都花在加载(或传输)大数据项上,而不是在5GB数据库中查找。因此,我假设查询经过适当优化,索引已正确使用,分析器也对此进行了确认。
因此,我认为从磁盘加载数据将花费大部分时间,但是似乎当我使用内存存储引擎时,事情实际上会变慢。这怎么可能?而我还能做些什么来加快速度?
在内存存储引擎中:
================ Starting test using mongodb://localhost:27018/ ================
Looking up 100 values excluding data column...
++++++++++ Query completed in 0.0130000114441 seconds ++++++++++
Looking up 100 values, full json with data...
++++++++++ Query completed in 2.85100007057 seconds ++++++++++
Looking up all values, excluding data column...
++++++++++ Query completed in 0.0999999046326 seconds for 916 items ++++++++++
Looking up all values, full json with data...
++++++++++ Query completed in 29.2250001431 seconds for 916 items ++++++++++
有线老虎:
================ Starting test using mongodb://localhost:27017/ ================
Looking up 100 values excluding mdo column...
++++++++++ Query completed in 0.0120000839233 seconds ++++++++++
Looking up 100 values, full json with data...
++++++++++ Query completed in 2.97799992561 seconds ++++++++++
Looking up all values, excluding data column...
++++++++++ Query completed in 0.0700001716614 seconds for 916 items ++++++++++
Looking up all values, full json with data...
++++++++++ Query completed in 23.8389999866 seconds for 916 items ++++++++++
答案 0 :(得分:0)
这并不快,因为带有WT的MongoDB无论如何都在内存中缓存数据,您有足够的RAM来存储要查询的数据以放入缓存中,因此从磁盘读取数据不会受到任何惩罚(当然,除了首次访问外) 。如果您从冷缓存开始,那么WT和内存将有显着差异,但是一旦访问数据并将其加载到缓存中,就不会有显着差异。
我直接怀疑是网络,如果每个都是5MiB,则超过916个文档,这意味着您正在获取(916 * 5 * 8)/23.84 = 1.537Gb/s
或对于第一个示例(916 * 5 * 8)/29.23 = 1.254Gb/s
-100个值的版本在相似的范围内。您没有提到这是Windows还是Linux,还是有关环境的其他信息(除了使用localhost之外),因此很难评论可能会加快速度的事情,但是我怀疑这是由于您当前的瓶颈。
答案 1 :(得分:0)
据我所知,WiredTiger将数据持久存储在磁盘中以用于索引,user_data,副本等。而内存存储引擎以较少的disk-io操作很好,因为它不会将任何数据持久存储在磁盘上。 另请参阅this
内存存储引擎要求其所有数据(包括oplog) 如果mongod是副本集等的一部分)适合指定的 --inMemorySizeGB命令行选项或storage.inMemory.engineConfig.inMemorySizeGB设置。请参阅内存使用。
因此,如果要查询的数据大小太大,则最终花费的时间将比WiredTiger长。