使用MySQL作为键/值数据库的可伸缩性

问题描述 投票:8回答:5

我很想知道使用MySQL作为键值数据库对Redis / MongoDB / CouchDB的性能影响。我过去使用过Redis和CouchDB,所以我对它们的用例非常熟悉,并且知道在NoSQL与MySQL之间存储键/值对更好。

但情况如下:

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

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

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

一个实际的例子是建立像MixPanel's Real-time Web Analytics Tracker这样的东西,这需要根据流量进行编写。

Wordpress和其他流行的软件一直使用它:Post具有“Meta”模型,它只是键/值,因此您可以向可以搜索的对象添加任意属性。

另一种选择是在blob中存储可序列化的哈希,但这看起来更糟。

你有什么看法?

sql mysql performance nosql key-value-store
5个回答
2
投票

毫无疑问,使用NOSQL解决方案会更快,因为它更简单。 NOSQL和Relational不会相互竞争,它们是可以解决不同问题的不同工具。 据说1000次写入/天或每小时,MySQL将没有问题。 每秒1000个,你需要一些花哨的硬件才能到达那里。对于NOSQL解决方案,您可能仍需要一些分布式文件系统。

它还取决于您存储的内容。


2
投票

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

考虑到这一点,这些人在这里做了相当多的测试:

  • InnoDB每秒插入43,000条记录AT ITS PEAK *;
  • TokuDB每秒插入34,000条记录AT ITS PEAK *;
  • 这个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时间更多不会有害!

有关详细信息,请参阅this(他们也将其与Tokyo Cabinet进行比较)。


1
投票

我会说你必须运行自己的基准测试,因为只有你知道以下重要方面:

  • 要存储在此KV表中的数据大小
  • 您想要实现的并行度
  • 到达MySQL实例的现有查询数

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

虽然我确实希望某些NoSQL解决方案更快,但根据您的约束,您可能会发现MySQL的性能足以满足您的要求。


1
投票

查看一系列博客文章here,其中作者运行测试比较MongoDB和MySQL性能,并通过MySQL性能调优混乱。 MongoDB每秒执行~100K行读取,而c / s模式下的MySQL最多执行43K,但是使用嵌入式库,他设法将其达到每秒172K行读取。

在单个节点上获得那么高的声音听起来有点复杂,所以ymmv。

写/秒问题有点困难,但这仍然可能会给你一些关于配置的想法。


0
投票

您应该首先以最简单的方式实现它然后比较它。总是测试一下。这意味着:

  • 创建一个代表您的用例的模式。
  • 创建代表您的用例的查询。
  • 创建大量代表您的用例的虚拟数据。
  • 在各种循环中,包括随机访问和顺序,基准标记它。
  • 确保您使用并发(运行许多进程随机锤击服务器以及代表您的用例的各种查询)。

一旦你有了,测量,测试。有不同的方法可以解决它。有些测试可能很简单但可能不太现实。测量吞吐量和延迟。

然后尝试优化它。

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

许多人将某些事情与缓慢关联,例如SQL,RELATIONAL,JOINS,ACID等。

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

虽然连接因缓慢而声名狼借,但这通常归结为对连接的误解。通常人们只会编写错误的查询。这更加困难,因为SQL是声明性的,它可能会出错,特别是对于通常有多种方式来执行连接的JOIN。在这种情况下,人们实际上从NoSQL中获得了什么是必不可少的。 NoDeclaritive会更准确,因为很多人都会遇到SQL的问题。人们往往缺乏索引。这不是支持联接的论据,而是说明人们在速度上可能出错的地方。

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

相比之下,NoSQL解决方案首先倾向于设计为支持开箱即用的各种扩展模式。单个节点的性能可能与您期望的不同。 NoSQL解决方案也很难用于一般用途,许多具有非常不寻常的性能特征或有限的功能集。

© www.soinside.com 2019 - 2024. All rights reserved.