使用键

时间:2016-06-12 22:24:19

标签: mysql database database-design nosql

我需要存储由地理点组成的地理路径数据,这些数据应该由唯一键索引。例如:车辆行驶的路径由其行程ID索引。该路径可以是无限长度的。

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

MySQL目前是我们的原始数据源(我们无论如何都会转移到NoSQL DB,但现在还没有)。但是由于存在大量数据(每天200万个地理点条目),MYSQL需要花费大量时间来根据时间戳过滤数据。 MySQL仍将是我们的主要数据源。我正在寻找的解决方案将充当基于id的更快路径检索的缓存。

在当前的MySQL架构中,我拥有的字段是:

system_timestamp,
gps_timestamp,
speed,
lat,
lot

此表存储车辆的所有地理位置,无论车辆是否在旅途中。这里的行程取决于驾驶员是否想跟踪运动。如果他想跟踪运动,我们会生成一个独特的旅行ID,并将其与旅行者的开始时间和结束时间相关联。稍后,为了显示基于行程ID的路径,我们使用start&从原始表中过滤数据的结束时间。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

典型的查找将获取行程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;