2014-03-02 136 views
4

我最近开始尝试为客户提供一些noSQL原型。他们得到了一个实时应用程序,它可以完成大量的插入操作,但读取次数却减少了(目前他们使用MySql并希望尝试一些noSQL解决方案)为什么Apache Cassandra写入速度与MongoDB,Redis和MySql相比如此之慢

在上周末,我尝试了Cassandra 2.0,MongoDB 2.4.9和Redis与普通的Mysql 5.5数据库进行比较。所有运行在我的Windows i3核心2.30 Ghz/8GB RAM笔记本电脑上,所以没有高端的花式机器。

表结构是一个简单的如下。尽管它是MySql DESC,但Cassandra具有相同的结构,而在MongoDb中,它存储为JSON/BSON,但具有相同的结构和索引。对于所有三个分贝,它有两个索引(oneway_id & twoway_id)。

结构(对于所有4分贝的)

+--------------+---------------------+ 
| Field  | Type    | 
+--------------+---------------------+ 
| tmstamp  | bigint(20) unsigned | 
| field_1  | bigint(20) unsigned | 
| field_2  | varchar(64)   | 
| field_3  | varchar(64)   | 
| field_4  | tinyint(3) unsigned | 
| field_5  | bigint(20) unsigned | 
| field_6  | varchar(25)   | 
| field_7  | varchar(15)   | 
| field_8  | varchar(15)   | 
| field_9  | varchar(15)   | 
+--------------+---------------------+ 

DB /环境的详细信息

  • MySQL的5.6(64位)与MySQL Java连接器5.1.28
  • 阿帕奇卡桑德拉2.0 with datastax 2.0 Java驱动程序
  • MongoDB 2.4.6 with mongo Java driv呃2.12.0
  • Redis的17年2月8日运行的Linux机器
  • 甲骨文的Java 1.6(64位)
  • 微软Windows 7(64位)
  • 英特尔酷睿i3 2。30 GHz处理器
  • 8GB RAM

创建一个简单的Java测试案例,这些都是我得到了(虽然不是始终相同的数字,但等待时间几乎相同的方式)结果:

100000记录

  • 的MySQL 1000,000 - 46秒
  • 卡桑德拉 - 54秒
  • MongoDB的 - 2秒

500000记录

  • 的MySQL 1000,000 - 142秒
  • 卡桑德拉 - 299秒
  • MongoDB的 - 41秒

1,000,000条记录

  • MySql的100万 - 349秒
  • 卡桑德拉 - 699秒
  • 的MongoDB - 51秒
  • 的Redis - 34秒

我的问题是,为什么卡桑德拉借此对于这样一个小而长的插入表?

在卡桑德拉我试了两个内联循环sql插入&批插入。有趣的是批量插入需要更多时间。我跟着批量插入文档是:

http://www.datastax.com/dev/blog/client-side-improvements-in-cassandra-2-0

我不想使用asyncExecute,因为它没有给我确切的插入时间。

这在我以前批量插入是这样的(这需要更多的年龄比正常插入)

PreparedStatement ps = session.prepare("INSERT INTO some_table (val_1, val_2, val_3, val_4) VALUES (?, ?, ?, ?)"); 
BatchStatement batch = new BatchStatement(); 

//for loop start 
batch.add(ps.bind(uid, mid1, title1, body1)); 
//for loop end 

session.execute(batch); 

线内回路我用刀片是这样

String sqlInsert = "INSERT INTO some_table (val_1, val_2, val_3, val_4) VALUES ("; 

// for loop start 

sqlInsert += uid+", "+", "+mid1+", "+title1+", "+body1+")"; 
session.execute(sqlInsert); 

// for loop end 

现在为什么卡桑达拉比mysql慢 - 更重要 - 为什么是 MongoDB比Cassandra快得多?我真的很希望我在做 错了什么?

有没有一种方法,我可以将JSON/BSON对象直接卡桑德拉像MongoDB的呢?我想 可能会让它变快?可以请一些高手帮我 这个吗?如果没有答案,我会得出结论:MongoDB比Cassandra更好!

回答

16

你的代码是使用串行插入。每个插入必须等待先前完成并返回一个确认,然后才能开始下一个。这是对可处理多个传入连接的任何数据库进行基准测试的不好方法。如果你真的不想使用execute_async(正确的方法),你应该编写一个多线程压力程序,以便插入不被阻塞(在客户端),并且你真正受到Cassandra节点的限制。基本上你所看到的是客户端程序运行的速度,而不是数据库的能力。感兴趣兴趣点

博客文章:

http://www.datastax.com/dev/blog/how-not-to-benchmark-cassandra

只有两个原则做负荷发电权:

饲料卡桑德拉足够的工作生成单独的机器上 这是工作量它!但它经常做错了,从同一台笔记本电脑作为卡桑德拉运行 单线程客户端的极端情况下, 使用Python全局解释器锁更微妙的问题。这似乎 像二进制搜索,这是令人惊讶的困难,以建立一个良好的 负载生成器。如果可能的话,避免使用自己的 ,并使用经过测试的东西。

+0

感谢。你说的都很好。但是,这与我将数据插入其他数据库(MySQL和MongoDB)的方式相同,并且它们预制得比Cassandra好得多。我会阅读那篇博文并重新回答你的答案。它看起来很有趣! – avijendr

+2

然后你不会饱和任何数据库,你需要调整你的测试方法。这些数据库旨在处理多个并发操作,而且您正在执行的任何测试都将测量您的代码而不是数据库。 一个类比将试图找出谷歌或雅虎是否可以通过每次运行100000个查询来处理更多的负载,并查看哪些查询完成了最快的查询。实际衡量的是客户与互联网的互动,而不是谷歌或雅虎后端的性能/吞吐量。 – RussS

+0

(测量是交互作用)当它在本地运行时如何?是否认真?我使用了多线程插入。但是我重申的是MongoDB和Mysql在插入方面的表现比Cassandra更好。对于10000插入或说100000插入(通过X线程),延迟比MySQL或MongoDB要慢得多。这就是我的意思!顺便说一句,MongoDB,Mysql或Cassandra没有任何调整。我已经阅读了很多文章,没有任何性能调整可以根据Cassandra的插入进行。 – avijendr

相关问题