2016-06-12 65 views
0

我需要存储由地理点组成的地理路径数据,这些地理点应由唯一键进行索引。例如:由其行程编号索引的车辆行驶的路径。这条路可以是无限长的。使用密钥存储无限大小的巨大json数据

截至目前,我正在考虑以JSON对象的形式存储路径。我脑海中的选项是RiakMongoDB。我想用开源技术。如果它支持集群将会很好。如果一个节点出现故障,我们在应用程序中不会出现任何停机。

MySQL目前是我们的原始数据源(我们将以任何方式转移到NoSQL DB,但不是现在)。但是,由于数据量巨大(每天有200万个地理位置条目),因此MYSQL需要很长时间才能根据时间戳过滤数据。 MySQL仍然是我们的主要数据源。我正在寻找的解决方案将作为基于id的更快路径检索的缓存。

在当前MySQL的架构,我有字段有:车辆

system_timestamp, 
gps_timestamp, 
speed, 
lat, 
lot 

该表存储中的所有地理点的车辆是否是在旅行或没有。这里的旅程是基于驾驶员是否想跟踪运动。如果他想跟踪运动,我们会生成一个唯一的行程ID,并将其与驾驶员的行程开始时间和结束时间相关联。稍后,根据旅程ID显示路径,我们使用行程的开始时间结束时间来过滤来自原始表格的数据。

我想将行程路径作为缓存存储到辅助数据库中,以便检索速度很快。

哪个数据库应该是我的理想选择?我还有什么其他选择?

+0

这似乎是一个有趣的话题,但有些事情我不清楚:1.目前数据如何存储在MySQL数据库中? 2.你究竟想达到什么目的?这听起来像一方面你试图按时间戳过滤,另一方面你想通过ID检索这些条目。 3.你通过ID和“路径”实际上意味着什么? –

+0

更新了问题中的信息。我在mysql中有两个表。一个根据时间戳存储地理点。在另一张桌子上,我有独特的旅行ID以及旅行的开始和结束时间。在选择特定行程ID时,时间戳之间可用的所有地理点应以路径的形式显示给用户。 我正在考虑缓存此路径,以便我可以节省检索时间。 –

+0

我不清楚你需要执行什么查询。鉴于trip_id,显示路径?给定位置,列出接近它的车辆?给定时间戳,获取vehicle_ids及其位置?你的问题在实施上过于详细,而且在目标上还不够详细。 –

回答

1

我打算在这里出去走一走,说我相信解决性能问题的方法不那么复杂。 我假设你在InnoDB中使用MySQL,并且你正在索引时间戳字段。

如果我是你,我只需将相关的时间戳(系统或gps)转换为主键。借助InnoDB,表格数据的物理组织可基于主键列进行超快速查找。另外,请确保相关的时间戳列是无符号的非空类型。

现在,我不会在开始时间和结束时间之间查找路径(正如您现在所做的那样),而是在包含旅程ID /路径时间戳对的同一MySQL数据库中创建一个单独的表,其中如前所述,“路径时间戳”是路径表中的主键。主要索引旅行ID。使用您最初为Riak或MongoDB设想的相同逻辑/机制填充此表。这基本上就是你的“缓存”系统,只使用MySQL。

一个典型的查找将采用trip ID来查找所有关联的路径时间戳,从而找到所有路径数据。

CREATE TABLE IF NOT EXISTS `paths` (
    `system_timestamp` int(10) unsigned NOT NULL, 
    `gps_timestamp` int(10) NOT NULL, 
    `speed` smallint(8) unsigned NOT NULL, 
    `lat` decimal(10,6) NOT NULL, 
    `lng` decimal(10,6) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

ALTER TABLE `paths` ADD PRIMARY KEY (`system_timestamp`); 


CREATE TABLE IF NOT EXISTS `trips` (
    `trip_id` int(10) unsigned NOT NULL, 
    `system_timestamp` int(10) unsigned NOT NULL, 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

ALTER TABLE `trips` ADD PRIMARY KEY (`trip_id`); 


SELECT * FROM `trips` 
INNER JOIN `paths` ON 
    `trips`.`system_timestamp` = `paths`.`system_timestamp` 
WHERE `trip_id` = 1; 
+0

在我的情况下,表不能根据时间戳索引。让您更了解我们的应用。以20,000辆车每10秒发送10个数据点(每秒1个数据点)为例。这只是安装在车内的OBD设备发送的数据。这些数据也由司机的手机以相同的速率发送。旅行的路径是从两个汇总数据 –

+1

我明白,数据量是非常大的,我认为这是一般非规范化属于某旅的路径是一个好主意(开始时间和行程结束时间之间)(如你之前描述过)为了提高性能,但是你想通过切换到NoSQL解决方案实现什么目标?我认为你的问题不是技术堆栈错误,而是索引太大,可能比缓冲池/机器的RAM大几倍。基本上,通过正确的硬件资源和正确的表结构,您可以在MySQL中实现相同的功能。 –

+0

顺便说一下,道歉离题,但你也可以根据时间戳相关的标准(例如,每天有它自己的表)将主路径表分成更小的表,并将它们分布到多台机器上。这种分片技术在过去为我工作。 –