【发布时间】:2018-02-18 11:11:41
【问题描述】:
几天前我在我的计算机上安装了 MongoDB 来做一些测试工作,具体来说,我们必须将大量数据从基于 Postgres 的系统传输到 MongoDB 系统。 因为我们不了解 MongoDB(我们第一次使用它),所以我们尝试研究文档,并在一个带有少量数据的小数据库上进行了一些测试以测试性能...... 在这个时候经过多次测试,我们仍然有一个恶化...... 但是现在我将解释上下文,所以也许有人可以告诉我我们是否做错了什么。 我们知道哪些是更“有问题”的查询,我将在这里写其中一个,在 Postgres 中,查询是这样的(我将删除不必要的):
selectStmt varchar = 'SELECT station.radarmeteo_id,
date(datetime_range) AS datetime_range,
district.name AS district,
city.name AS city,
min_temperature::real / 10::real,
max_temperature::real / 10::real,
rainfall_daily::real / 10::real,
max_wind_speed::real / 10::real,
extract(epoch FROM datetime_range) as unix_datetime ';
fromStmt varchar = ' FROM measurement_daily
INNER JOIN station ON measurement_daily.station_id = station.id;
在 MongoDB 中我们这样写:
db.measurement_daily.aggregate([{"$match":{"min_temperature":{"$gt":random.randint(-30, 14), "$lt":random.randint(18, 50)}}},{"$lookup":{"from":"station","localField":"station_id", "foreignField":"_id", "as": "scd"}},{"$unwind":"$scd"},{"$project":{"_id":1,"min_temperature":1,"max_temperature":1, "rainfall_daily":1, "max_wind_speed":1, "radarmeteo_id":"$scd.radarmeteo_id", "city_name":"$scd.city_name", "district_name":"$scd.district_name"}},{"$out":"result"}])
我在这里要问的是:它应该写得更好吗?还是有更好的方法来获得相同的结果?我们可以使用其他优化吗? 我们需要最好的响应时间,因为真正的数据库应该只有这个集合中的 200.000.000 个数据...... 就在这里,有 2 个表分别有 1000 个(站)和 6400 个(measurement_daily)记录/文档,我们有 3,5-4s(Postgres)和 30-32s(MongoDB)作为响应时间...... (为了测试两个系统中的性能,查询重复 200 次(这就是为什么我们分别为一个查询设置 3,5-4 秒和 30-32 秒的原因)以获得“均匀”的响应时间,以最大限度地减少外部原因造成的影响。) 任何帮助都非常感谢......
【问题讨论】:
标签: mongodb optimization match lookup aggregation