Cassandra在简单操作方面比Mysql慢吗?

7

我看到很多这样的说法:“Cassandra写入非常快”,“Cassandra的读取速度比写入慢,但比Mysql快得多”。

在我的Windows7系统上: 我安装了默认配置的Mysql。 我安装了默认配置的PHP5。 我安装了默认配置的Casssandra。

在Mysql上进行简单的写入测试:“INSERT INTO wp_test (id,title) VALUES('id01','test')”给出了结果:0.0002秒 对于1000个插入:0.1106秒

在Cassandra上进行相同的简单写入测试:$column_faily->insert('id01',array('title'=>'test')) 给出结果:0.005秒 对于1000个插入:1.047秒

在读取测试中,我也发现Cassandra比mysql慢得多。

因此问题是,我在Cassadra上进行一次写入操作需要5毫秒,这是否正确?还是有什么问题,至少应该是0.5毫秒。


1
这里的http://stackoverflow.com/questions/4068946/a-bit-of-advice-on-cassandra-vs-mysql 和 https://dev59.com/HnE95IYBdhLWcg3wY89l 可能有一些有用的建议。 - Jeremy Harris
如果Cassandra在Linux系统上会更开心,那也不足为奇。 - ceejayoz
1
你不能只用一条记录进行测试,要用一百万条。MySQL在写入时会变慢(特别是如果使用InnoDB),但基于主键的读取可能会与之前一样快甚至更快。 - N.B.
@ceejayoz,在 Linux 系统上测试,结果相同。 - Ivan Gusev
1
Cassandra是为了扩展而构建的。在这样的基准测试中(一个客户端只进行1000次插入),MySQL会获胜。当你的MySQL超过1台机器并且必须将数据和负载分散到多台机器上时,你将从Cassandra中获得优势。 - nos
显示剩余2条评论
4个回答

13

当人们说“Cassandra比MySQL更快”时,他们指的是当你处理数千兆字节的数据和许多同时用户时。Cassandra(以及许多分布式NoSQL数据库)针对于许多节点上的数百个并发读写器进行了优化,而 MySQL(以及其他关系型数据库)则针对单个节点进行了极速优化,但当你尝试将它们扩展到多个节点时往往会崩溃。顺便说一下,存在一个这种权衡的广义- 绝对最快的磁盘I /O是纯粹的UNIX平面文件,许多响应延迟敏感的金融应用程序因此使用它们。

如果您正在构建下一个Facebook,您需要像Cassandra这样的东西,因为单个MySQL框永远无法经受住数千个并发读写的打击,而使用Cassandra,您可以扩展到数百个数据节点并轻松处理该负载。请参见扩展性

另一个用例是当您需要将大量批处理能力应用于数千亿字节或拍字节的数据时。 Cassandra或HBase非常棒,因为它们与MapReduce集成在一起,允许您在数据节点上运行处理。使用MySQL,您需要提取数据并在处理节点网格上分散它,这将消耗大量网络带宽,并涉及许多不必要的复杂性。


2
我已经阅读了很多有关Cassandra的好处的文章。我的问题是关于单个服务器每个写操作5ms的速度是否正确?例如,如果有人告诉我他的mysql每个写操作需要5ms(让我们考虑平均服务器),我会回复他说“通常应该更快”。 - Ivan Gusev
MySQL在单节点上处理数TB数据/多用户表现良好,但不是最佳选择。人们说它在执行事务时很慢等等,但你不必做MySQL允许你做的所有事情。区别在于Cassandra不允许你这样做。Cassandra的限制确实使其更好地扩展。Cassandra的一个限制是它只能相对较好地执行一个操作,即插入。它可以在读取KV或单个范围索引方面做得还不错。之后就不太行了。然而,随着时间的推移,Cassandra正在添加更多功能以获得更一致的性能。 - jgmjgm
Cassandra的模型倾向于始终具有快速插入,通常读取较慢,目的是人们将采取其他措施来解决读取限制。 - jgmjgm

3

Cassandra从并行化和批处理中获益匪浅。尝试在100个线程上分别进行100万次插入(每个线程都有自己的连接,并且以100的批次进行),看看哪些更快。

最后,Cassandra插入性能应该相对稳定(保持高吞吐量很长时间)。而MySQL,在用于索引的B树内存增长过大时,性能会急剧下降。


问题是关于一个进程中每秒钟插入1个或1000个数据的常规速度(假设像一个用户点击按钮)。如果我同时发送这1000个插入操作,那么速度会比1秒更快吗?如果我有任何错误,请纠正我。 - Ivan Gusev
如果你进行测试,请确保插入是可比较的。不要在MySQL上启用Cassandra没有的功能。确保MySQL只插入不安全或仅记录日志。 - jgmjgm

0

MySQL驱动程序的成熟度很可能对测试产生了影响,特别是PHP 5.3中改进的MySQL驱动程序。你查询中数据的简单性也完全有可能影响结果——也许在插入100个值时,Cassandra会更快。

尝试从命令行运行相同的测试并查看时间戳,然后尝试使用不同数量的值进行测试。你不能只做一次测试就基于那个决定。


假设我试图释放典型情况:我有数百万用户,每个用户都想上传1000个名称(例如,书名)。从我的测试中(与命令行相同),每个用户将等待超过1秒的结果。如果我的用户少于数百万,则MySQL会给我0.1秒。这听起来正确吗? - Ivan Gusev
应该测试批量插入。 - jgmjgm

0

很多用户空间因素都会影响写入性能,例如:

  • 数据库服务器配置中的数十个设置。
  • 表结构和设置。
  • 连接设置。
  • 查询设置。

你是否忽略了警告或异常?在正常情况下,MySQL 示例应该会产生重复键错误。但它可能在什么都不做的情况下失败。Cassandra 在同样的情况下可能会做些什么,我并不熟悉。

我对 Cassandra 的有限经验告诉我一个关于插入的事情,就是随着数据量的增长,其他所有操作的性能都会下降,而插入似乎保持相同的速度。然而,与 MySQL 相比,它有多快我没有测试过。

可能并不是插入速度快,而是试图永远不变慢。如果你想进行更有意义的测试,你需要加入并发以及更多场景的变化,例如大数据集、各种批量大小等。更复杂的测试可能会测试插入后可用性数据延迟和阅读速度随时间的变化。

我不会感到惊讶,如果 Cassandra 插入数据的第一步是将其放入队列中或者简单地追加。如果你查看一致性级别,这是可配置的。MySQL 同样允许你在性能和可靠性/可用性之间取得平衡,尽管每个系统都会有各种允许和不允许的变化。

除非你深入了解内部机制,否则很难判断为什么一个表现比另一个好。

我曾经对Cassandra进行过一些基准测试。在基准测试中,首先会插入数万行数据。我不得不让脚本休眠几秒钟,否则在测试不同实现时运行的查询将无法看到数据,结果将不一致。

如果你真的想要快速插入,请将其附加到ramdisk上的文件中。


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