0

我正在运行一个返回大量数据的查询。它查找 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 ++++++++++ 
4

2 回答 2

0

它并没有更快,因为带有 WT 的 MongoDB 无论如何都会将数据缓存在内存中,您有足够的 RAM 来存储要查询的数据以放入缓存中,因此从磁盘读取不会受到任何惩罚(当然,第一次访问除外)。如果您从冷缓存开始,您会看到 WT 与内存中的显着差异,但一旦数据被访问并加载到缓存中就不会。

我的直接怀疑是网络,如果这是超过 916 个文档的每个 5MiB,这意味着您正在获取(916 * 5 * 8)/23.84 = 1.537Gb/s或对于第一个示例(916 * 5 * 8)/29.23 = 1.254Gb/s- 100 个值版本在相似的范围内。您没有提到这是 Windows 还是 Linux,或者除了使用 localhost 之外的任何其他关于环境的内容,因此很难评论什么可能会加快速度,但我怀疑这是数据的传输你目前的瓶颈。

于 2018-07-05T13:53:18.160 回答
0

据我所知,WiredTiger 将数据保存在磁盘中以用于索引、user_data、副本等,而内存存储引擎在磁盘 io 操作较少的情况下表现良好,因为它不会在磁盘上保存任何数据。也读这个

内存存储引擎要求其所有数据(如果 mongod 是副本集的一部分,则包括 oplog 等)适合指定的 --inMemorySizeGB 命令行选项或 storage.inMemory.engineConfig.inMemorySizeGB 设置。请参阅内存使用。

因此,如果您查询的数据量太大,最终将比 WiredTiger 花费更长的时间。

于 2018-07-05T13:55:34.140 回答