使用MySQL作为键值数据库的可扩展性

9
我想了解在使用MySQL作为键值数据库与使用Redis/MongoDB/CouchDB时性能的影响。我以前使用过Redis和CouchDB,所以非常熟悉它们的使用情况,并且知道将键/值对存储在NoSQL中(例如MongoDB)比存储在MySQL中要好。

但是这里有一个情况:

  • 我们的大部分应用程序已经有很多MySQL表
  • 我们在Heroku上托管所有东西(只有MongoDB和MySQL,并且基本上是每个应用程序1种数据​​库类型)
  • 在这种情况下,我们不想使用多个不同的数据库。

因此,基本上,我正在寻找关于在MySQL中拥有键/值表的可扩展性的一些信息。也许有三个不同的任意层次:

  • 每天1000次写入
  • 每小时1000次写入
  • 每秒钟1000次写入
  • 每小时1000读取
  • 每秒钟1000次读取

一个实际的例子是构建像MixPanel的实时网络分析跟踪器这样的东西,这将根据流量经常进行写入。

WordPress和其他流行的软件经常使用这种方式:文章具有“元”模型,它只是键/值对,因此您可以向对象添加任意属性,可以进行搜索。
另一个选项是在blob中存储可序列化的哈希,但这似乎更糟糕。
你怎么看?

http://bret.appspot.com/entry/how-friendfeed-uses-mysql - Mehrdad Afshari
5个回答

2

SQL数据库越来越多地被用作持久层,而计算和交付则缓存在Key-Value存储库中。

有了这个想法,这些人在这里做了相当多的测试:

  • InnoDB在其高峰时每秒插入43,000条记录*;
  • TokuDB在其高峰时每秒插入34,000条记录*;
  • 这个KV每秒插入1亿条记录(超过2,000倍)。

回答你的问题,Key-Value存储库很可能比MySQL快几个数量级:

处理100,000,000个项目:

kv_add()....time:....978.32 ms
kv_get().....time:....297.07 ms
kv_free()....time:........0.00 ms

好的,你的测试结果是每秒 1,000 次操作,但增加能力到 1,000,000 次也不会有害。

请参考这里获取更多细节(他们还将其与Tokyo Cabinet进行了比较)。


1
链接已经失效,网络档案馆也没有它的副本。有什么替代方案吗? - E. Körner

2

我认为您需要进行自己的基准测试,因为只有您了解以下重要方面:

  • 要存储在此KV表中的数据大小
  • 您希望实现的并行级别
  • 到达您的MySQL实例的现有查询数量

我还要说的是,根据对数据的耐久性要求,您还需要测试多个引擎:InnoDB、MyISAM。

虽然我预计某些NoSQL解决方案会更快,但基于您的约束条件,您可能会发现MySQL已经足够满足您的需求。


1

毫无疑问,使用NOSQL解决方案会更快,因为它更简单。
NOSQL和关系型数据库并不相互竞争,它们是可以解决不同问题的不同工具。
话虽如此,对于每天或每小时1000次写入,MySQL不会有任何问题。
对于每秒1000次写入,您将需要一些高级硬件才能达到这个水平。对于NOSQL解决方案,您可能仍然需要一些分布式文件系统。

这也取决于您要存储什么。


6
在我的Celeron 1.8GHz上,没有任何调整,我每秒可以向InnoDB插入4000个记录。 - zerkms

1

请查看这里的博客系列文章,作者在其中运行测试比较了MongoDB和MySQL的性能,并通过MySQL性能调优解决了问题。MongoDB每秒执行约100K行读取操作,以c/s模式运行的MySQL最多只能达到43K行读取操作,但使用嵌入式库后,他成功将其提高到172K行读取操作每秒。

要在单个节点上实现如此高的性能似乎有些复杂,所以结果可能因人而异。

关于每秒写入次数的问题稍微有些难度,但这仍然可能为您提供一些尝试配置的想法。


0

你应该先以最简单的方式实现它,然后进行比较。始终测试事物。这意味着:

  • 创建一个代表您用例的模式。
  • 创建代表您用例的查询。
  • 创建大量代表您用例的虚拟数据。
  • 在各种循环中(包括随机访问和顺序访问),对其进行基准测试。
  • 确保使用并发性(运行许多进程,随机地向服务器发送各种代表您用例的查询)。

一旦完成,测量、测试。有不同的方法可以进行测试。有些测试可能很简单,但可能不太现实。测量吞吐量和延迟。

然后尝试优化它。

MySQL 对于 KV 有一个特定的限制,即具有持久性的标准引擎使用为范围查找优化的索引,而不是为 KV 优化的索引,这可能会引入一些开销,尽管由于重新哈希等原因,使哈希等内容与持久性存储一起工作也很困难。内存表支持哈希索引。

许多人将某些东西与缓慢联系在一起,例如 SQL、关系、连接、ACID 等。

在使用支持 ACID 的关系型数据库时,您不必一定使用 ACID 或关系。

虽然连接在速度上有不好的声誉,但这通常是关于连接的误解。很多时候人们只是编写了糟糕的查询语句。这更加困难的是 SQL 是声明式的,它可能会出错,特别是在 JOINs 中,因为通常有多种方法来执行连接。在这种情况下,人们实际上从 NoSQL 中获得的是命令式的。NoDeclaritive 更准确,因为这是许多人在 SQL 中遇到的问题。很多时候人们只是缺乏索引。这并不是支持连接的论点,而是为了阐明人们在速度方面可能会犯错误的地方。

如果你做一些特殊的事情,如忽略数据完整性或在其他地方处理数据完整性,传统数据库可以非常快。你不必等待硬盘刷新写入,你不必强制执行关系,你不必强制执行唯一约束,你不必使用事务,但如果你用速度代替安全,那么你需要知道你在做什么。

相比之下,NoSQL 解决方案首先主要设计为支持各种模式的扩展。单个节点的性能可能不是你所期望的。NoSQL 解决方案在一般使用中也存在困难,许多解决方案具有相当不寻常的性能特征或有限的功能集。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接