gpt4 book ai didi

javascript - MongoDB,大数据慢查询

转载 作者:行者123 更新时间:2023-11-30 17:42:39 24 4
gpt4 key购买 nike

我正在尝试对 mongodb 中的一个大集合执行查询,实际上该查询由两部分组成,总共需要大约 900 毫秒才能执行,我需要它更快。

这些是集合,停止时间:

> db.stoptimes.find().limit(1);
{
"trip_id": "24893A459B661",
"arrival_time": "22:30:00",
"departure_time": "22:30:00",
"stop_id": "1904",
"stop_sequence": 2,
"stop_headsign": "",
"pickup_type": "0",
"drop_off_type": "0",
"shape_dist_traveled": "0.88659123054",
"agency_key": "alamedaoakland-ferry",
"_id": ObjectId("52b394c680052ea30918fd62")
}
> db.stoptimes.count();
5959551

行程:

> db.trips.find().limit(1);
{
"route_id": "60",
"service_id": "180A536",
"trip_id": "23736A180B536",
"trip_short_name": "",
"trip_headsign": "San Francisco via Pier 41",
"direction_id": "",
"block_id": "282",
"shape_id": "30",
"trip_bikes_allowed": "2",
"agency_key": "alamedaoakland-ferry",
"_id": ObjectId("52b394c780052ea30918ff34")
}
> db.trips.count();
204884

我正在尝试在行程集合中找到每个不同的 route_id,其中 trip_id 等于与停止时间中给定的 stop_id 匹配的每个行程 ID。

------ stoptimes --- -> ---------- trips -----------------
stop_id1 -> trip_id1 -> trip_id1 -> route_id1 -> route_id1
-> trip_id2 -> trip_id2 -> route_id2 -> route_id2
-> trip_id3 -> trip_id3 -> route_id2
-> trip_id4 -> trip_id4 -> route_id2
-> trip_id5 -> trip_id5 -> route_id3 -> route_id3

这是 mongodb shell 中的查询:

> var tripids = db.stoptimes.aggregate([
... {$match : { 'stop_id' : '1904' }},
... {$project : { '_id' : 0, 'trip_id' : 1 }}
... ]);
> var arr = [];
> for(var i=0; i<tripids.result.length; i++)
... { arr.push(tripids.result[i].trip_id); }
> db.trips.aggregate([
... {$match : { 'trip_id' : {$in : arr}}},
... {$group : {
... _id : "$route_id",
... direction_id : { $first: '$direction_id'},
... shape_id : {$first : '$shape_id'}}}
... ])

这是我正在使用的一段 javascript,请注意它是 node.js + mongoose,但它应该很容易阅读,因为它是纯 javascript:

StopTime
.aggregate([
{$match : {
'stop_id' : stop_id
}},
{$project : {
'_id' : 0,
'trip_id' : 1
}}
], function (err, trip_ids){
var arr = [];
for(var i=0;i<trip_ids.length;i++) {
arr.push(trip_ids[i].trip_id);
}
Trip
.aggregate([
{$match : {
'trip_id' : {$in : arr}
}},
{$group : {
_id : "$route_id",
direction_id : { $first: '$direction_id'},
shape_id : { $first: '$shape_id'}
}}
], function (err, route_ids){
cb(err, route_ids);
});
});

我可以做些什么来提高性能?

编辑:

这是唯一一个花费这么长时间的查询:

> db.trips.aggregate([
... {$match : { 'trip_id' : {$in : arr}}},
... {$group : {
... _id : "$route_id",
... direction_id : { $first: '$direction_id'},
... shape_id : {$first : '$shape_id'}}}
... ])

最佳答案

这看起来您正在对匹配数组中任何记录的所有行程(204884 次行程)运行聚合方法。如果那是真的,那么您正在处理大约 228 条记录/毫秒,这非常好。

您可以在代码中进行一些明显的优化

除非有特定原因,否则永远不要使用 i++,始终将其写为++i 并将计数放在单独的变量中

var trip_ids_length = trip_ids.length;
for(var i=0;i<trip_ids_length;++i) {
arr.push(trip_ids[i].trip_id);
}

您的 trip_id 是一个非常复杂的字符串,即24893A459B661,字符串比较总是比整数比较慢。此外,比赛还必须为它将测试的每个比赛拉取指定的 json 行。

一些选项

  • 重新考虑停靠时间和行程的对象,最好的捷径是用整数值替换 trip_id
  • 创建一个索引列表,其中包含所有更小、更快的 trip_id 以进行匹配,您应该将关联对象的 INDEX 存储在trips 和/或stoptimes 中; IE。 t_index 和 s_index
  • 创建一个网络服务,配置为在静态内存中保存行程和停止时间,并在那里进行匹配

我个人的看法是,与常规关系数据库引擎相比,MongoDB 和类似引擎还不能真正处理此类操作,即SQL Server、MySQL、PostgreSQL

关于javascript - MongoDB,大数据慢查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20746783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com