我很想知道使用MySQL作为键值数据库对Redis / MongoDB / CouchDB的性能影响。我过去使用过Redis和CouchDB,所以我对它们的用例非常熟悉,并且知道在NoSQL与MySQL之间存储键/值对更好。
但情况如下:
所以基本上,我正在寻找关于在MySQL中拥有键/值表的可伸缩性的一些信息。也许在三个不同的任意层:
一个实际的例子是建立像MixPanel's Real-time Web Analytics Tracker这样的东西,这需要根据流量进行编写。
Wordpress和其他流行的软件一直使用它:Post具有“Meta”模型,它只是键/值,因此您可以向可以搜索的对象添加任意属性。
另一种选择是在blob中存储可序列化的哈希,但这看起来更糟。
你有什么看法?
毫无疑问,使用NOSQL解决方案会更快,因为它更简单。 NOSQL和Relational不会相互竞争,它们是可以解决不同问题的不同工具。 据说1000次写入/天或每小时,MySQL将没有问题。 每秒1000个,你需要一些花哨的硬件才能到达那里。对于NOSQL解决方案,您可能仍需要一些分布式文件系统。
它还取决于您存储的内容。
SQL
数据库越来越多地用作持久层,计算和交付缓存在Key-Value
存储库中。
考虑到这一点,这些人在这里做了相当多的测试:
要回答你的问题,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
进行比较)。
我会说你必须运行自己的基准测试,因为只有你知道以下重要方面:
我还要说,根据这些数据的耐久性要求,您还需要测试多个引擎:InnoDB,MyISAM。
虽然我确实希望某些NoSQL解决方案更快,但根据您的约束,您可能会发现MySQL的性能足以满足您的要求。
查看一系列博客文章here,其中作者运行测试比较MongoDB和MySQL性能,并通过MySQL性能调优混乱。 MongoDB每秒执行~100K行读取,而c / s模式下的MySQL最多执行43K,但是使用嵌入式库,他设法将其达到每秒172K行读取。
在单个节点上获得那么高的声音听起来有点复杂,所以ymmv。
写/秒问题有点困难,但这仍然可能会给你一些关于配置的想法。
您应该首先以最简单的方式实现它然后比较它。总是测试一下。这意味着:
一旦你有了,测量,测试。有不同的方法可以解决它。有些测试可能很简单但可能不太现实。测量吞吐量和延迟。
然后尝试优化它。
MySQL对KV有一个特殊的限制,即标准引擎具有针对范围查找而优化的持久性使用索引,而不是KV,这可能会引入一些开销,尽管由于重新散列而使哈希工作与持久存储一起工作也很困难。内存表支持哈希索引。
许多人将某些事情与缓慢关联,例如SQL,RELATIONAL,JOINS,ACID等。
使用支持ACID的关系数据库时,您不必使用ACID或关系。
虽然连接因缓慢而声名狼借,但这通常归结为对连接的误解。通常人们只会编写错误的查询。这更加困难,因为SQL是声明性的,它可能会出错,特别是对于通常有多种方式来执行连接的JOIN。在这种情况下,人们实际上从NoSQL中获得了什么是必不可少的。 NoDeclaritive会更准确,因为很多人都会遇到SQL的问题。人们往往缺乏索引。这不是支持联接的论据,而是说明人们在速度上可能出错的地方。
如果您为此做某些特殊事情,例如忽略数据完整性或在其他地方处理它,传统数据库可以非常快。您不必等待硬盘驱动器刷新写入,您不必强制执行关系,您不必强制执行唯一约束,您不必使用事务,但如果您确实用速度替换安全性然后你需要知道你在做什么。
相比之下,NoSQL解决方案首先倾向于设计为支持开箱即用的各种扩展模式。单个节点的性能可能与您期望的不同。 NoSQL解决方案也很难用于一般用途,许多具有非常不寻常的性能特征或有限的功能集。