我有一个包含大约1 000 000个文档的mongo集合。该集合在'product_type'字段上有一个索引(在其他索引中)。产品类型"foo"大约有7万项。当我在本地开发机器上执行查询(见下文)时,查询大约需要1秒。当我在AWS DocumentDb上执行完全相同的查询(具有相同大小的集合和索引,以及类似的计算能力)时,查询可能需要60秒到1500秒(取决于指定的product_type)。我正在通过python flask应用程序执行查询(在同一地理区域的EC2实例上运行)。查询还执行投影,只返回文档id和另一个属性。这似乎是全面的情况下,我的查询是慢得多的DocumentDb。附加信息:服务器实例位于bastion服务器后面,flask应用程序运行在Apache服务器上(安装在EC2实例上)。一切都在VPC内运行。似乎所有的查询都变慢了(不仅仅是这个查询)。谁能给我一些建议,什么可能是造成瓶颈的原因?
查询:
query = {
'properties.property1': {'$ne': None},
'properties.property2': {'$ne': None},
'properties.property3': {'$ne': None},
'properties.property4': {'$ne': None},
'properties.property5': {'$ne': None},
'product_ids': {'$ne': None},
'properties.property6': {'$ne': None},
'properties.property7': {'$ne': None},
'properties.property8': {'$ne': None},
'properties.property9': {'$ne': None},
'properties.property10': {'$ne': None},
'properties.property11': {'$ne': None},
'properties.property12': {'$ne': None},
'properties.property13': {'$ne': None},
'properties.property14': {'$ne': None},
'product_type': {'$regex': '^foo$', '$options': 'i'},
'date': {'$ne': None},
'status': 'ENABLED',
'properties': {'$ne': None},
'properties.property15': {'$ne': True}
}
我试图加快查询的事情(没有太大的成功):删除正则表达式并将product_type直接设置为'foo'使用'skip'和'limit'批量执行查询尝试使用不同的索引('product_type')是迄今为止我能找到的最好的索引。尝试查询的不同变体(从查询中删除不同的项)
关于Amazon DocumentDB有一些功能差异,其中之一是对于$regex
,您必须明确提示索引才能使用它。另外,我看到您正在使用$ne
,目前没有索引支持,您可能必须将查询修改为相等过滤器或可能使用比较运算符。如MongoDB文档中所述:
不等式运算符美元不不是很有选择性,因为它经常匹配索引的很大一部分。因此,在许多情况下,a美元不带有索引的查询可能不会比美元不必须扫描集合中所有文档的查询。