存储引擎,用于大量不断插入的数据,应立即可用

时间:2011-12-23 09:25:58

标签: mysql sql database architecture

我们的服务器(Debian上的几个Java应用程序)处理应该是的传入数据(GNSS观察):

  1. 立即(延迟<200ms)发送到其他应用程序,
  2. 存储以供进一步使用。
  3. 有时候(可能一天几次)将从数据库中提取大约数百万个存档记录。记录大小约为12个双精度字段+时间戳和一些ID。没有更新; DELETE是非常罕见的但是很大。传入流量高达每秒100条记录。所以我不得不为这些数据选择存储引擎。

    我尝试使用MySQL(InnoDB)。一个应用程序插入,其他应用程序不断检查最后一个记录ID,如果更新,则获取新记录。这部分工作正常。但我遇到了以下问题:

    1. 记录非常大(每条记录约200-240字节)。
    2. 获取数百万个存档记录是不可接受的缓慢(几十分钟或更长时间)。
    3. 基于文件的存储可以正常工作(因为DB中间没有插入,选择大多是'WHERE ID = 1和2000和3000之间的时间',但还有其他问题:

      1. 寻找新数据可能并不那么容易。
      2. 日志和配置等其他数据存储在同一个数据库中,我更喜欢为所有内容创建一个数据库。
      3. 您能建议一些合适的数据库引擎(SQL首选,但不是必需的)?也许有可能微调MySQL以减少记录大小并获取连续数据条的时间?

        MongoDB是不可接受的,因为在32位计算机上数据库大小是有限的。任何不能为最近插入的数据提供快速访问的引擎也是不可接受的。

2 个答案:

答案 0 :(得分:3)

我建议在MySQL上使用TokuDB存储引擎。它可以免费获得高达50GB的用户数据,并且它的定价模式并不可怕,使其成为存储大量数据的绝佳选择。

与InnoDB和MyISAM相比,它具有更高的插入速度,并且随着数据集的增长而扩展得更好(一旦工作数据集不适合RAM,其性能取决于HDD子系统的I / O,InnoDB就会恶化)。

它也符合ACID并支持多个聚簇索引(对于您计划进行的大规模DELETE而言,这将是一个很好的选择)。此外,支持热架构更改(ALTER TABLE不会锁定表,并且对巨大的表进行快速更改 - 我说的是几十秒内改变了千兆字节大小的表)。

从我个人的角度来看,由于TokuDB的压缩,我的磁盘使用量减少了大约5-10倍,并且比MyISAM或InnoDB快得多。 虽然听起来我正在试图宣传这个产品 - 我不是,但这简直太令人惊讶了,因为你可以使用单片数据存储,而不需要像跨节点划分来扩展写入等昂贵的扩展计划。

答案 1 :(得分:2)

从磁盘加载数百万条记录需要花费多长时间。您的32位要求意味着您可以使用多少RAM来用于基于内存的数据结构。但是,如果您想使用MySQL,您可以使用多种表类型获得良好的性能。

如果您需要非常快速的非阻塞插入。您可以使用黑洞表类型和复制。发生插入的服务器具有黑洞表类型,该表类型复制到表为Innodb或MyISAM的另一台服务器。

由于你不做UPDATE,我认为在这种情况下MyISAM会比Innodb更好。您可以为MyISAM使用MERGE表类型(不适用于Innodb)。不确定你的数据集是什么样的,但你每天可以有1个表(小时,星期?),那么你的MERGE表就是这些表的超集。假设您希望按日删除旧数据,只需将MERGE表重新声明为不包括旧表。这个动作是即时的。删除旧表也非常快。

要检查新数据,您可以直接查看“今日”表,而不是通过MERGE表。