2

我们有一个巨大的 MS SQL 数据库,它只包含一个表。这个表很简单,我们只做select、insert和delete。没有加入或更新操作。更重要的是,插入/删除操作来自当前架构中的单个主机。

数据库查询非常慢,即使我们很难添加索引,它们也没有足够的帮助。我们可以使用无限数量的小型主机,我们正在考虑转向分布式数据库解决方案。但我们希望查询界面尽可能与今天相似。

  1. 什么是最能满足我们需求的?
  2. 以 == x 形式查询的惩罚是什么
  3. 我们如何进行这种转移?最少的数据库停机时间当然是可取的,但我们可以管理(它保存了 BI 信息)。
  4. 我们正在使用 JDBC,因为我们正在从 Java 应用程序访问,哪些与它一起工作得很好?
  5. 据我了解,我们需要面向文档的数据库,对吗?

我们有很多按字段的查询,我们为其中一些维护键。更重要的是 id 和一些日期字段。我们不仅通过键查询,而且对所有字段都有查询。我们维护一个有很多列的大表。也许 HIVE 提供了我们想要的解决方案,SQL 查询但具有分布式数据库性能?
插入和删除性能不太重要。长查询是目前困扰我们的问题。

谢谢!

4

3 回答 3

1

有两个选项可以帮助您使用当前的 RDBMS

  • 你能分片信息吗?您是否有一些自然键(用户名、用户 ID、时间 - 月/日/小时等),您可以通过这些键将信息分成几个表?就其本身而言,这应该会给您带来巨大的好处,因为表格大小将大大减少。我已经成功使用了几次。请注意,这意味着它改变了您访问数据库的方式——所有 CRUD 操作都必须考虑分片,并且聚合方法变得更加复杂,因为它们必须在多个表上运行。
  • 你使用某种复制吗?如果您将写入拆分到一台服务器并将写入拆分到另一台服务器,它应该会提高性能。

为了更好地回答哪个数据库适合您,请提供有关架构和用法的更多信息 - 您是仅按主键还是按字段查询?如果您索引字段,那么面向文档的数据库可能适合您。同样,这取决于信息的总量。一些数据库(如 MongoDB)在它们可以处理和推荐的分片信息量方面也受到限制。所有流行的数据库都支持 Java,但不支持 JDBC(因为没有关系...)

关于迁移 - 我建议采用两阶段的方法:

  1. 转储当前信息并将其(转换后)插入新数据库
  2. 在您的 Java 代码中,向您的 DAO 添加一个将新数据插入 RDBMS 和新数据库的代码。干净利落的切换可能很棘手,但您可以设置一个基于时间的阈值,这可能会使其更容易。

最后一个建议——你看过像VoltDB这样的新 SQL 数据库吗?

编辑

根据您所写的内容,我建议两者中的任何一个:

  • 面向文档的数据库,例如 MongoDB 或 CouchDB 等,它们将允许您索引字段而不仅仅是主键。此外,Couchbase 将在几周后进行CouchConf-Israel,因此您也可以去寻求帮助(对于热门建议的时间性质,抱歉...)
  • 面向列的数据库,例如 HBase,但在这里您需要为字段索引添加表,因为只能搜索表的主键。

请注意,Hive 是编写 Hadoop map-reduce 方法的好方法,它不保证任何性能提升。

我也同意 Shai Berger 的观点——一张大桌子听起来确实有设计的味道。你能打破它吗?

于 2012-11-18T11:15:09.607 回答
0

你试过Memcached吗?它在不改变您的数据库基础设施的情况下对 RDBMS 做了很多好事,即根据您的查询模式,您应该期望在 x2-x10 性能改进之间有任何东西。Memcached 客户端适用于所有编程语言和平台

于 2012-11-18T14:16:08.407 回答
0

该表可能已变得支离破碎。您可以尝试导出和导入到不同的服务器并运行相同的查询。如果他们跑得更快,那么它很可能是碎片化的。

于 2012-11-17T09:30:52.997 回答