我最近开始尝试为客户提供一些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更好!
感谢。你说的都很好。但是,这与我将数据插入其他数据库(MySQL和MongoDB)的方式相同,并且它们预制得比Cassandra好得多。我会阅读那篇博文并重新回答你的答案。它看起来很有趣! – avijendr
然后你不会饱和任何数据库,你需要调整你的测试方法。这些数据库旨在处理多个并发操作,而且您正在执行的任何测试都将测量您的代码而不是数据库。 一个类比将试图找出谷歌或雅虎是否可以通过每次运行100000个查询来处理更多的负载,并查看哪些查询完成了最快的查询。实际衡量的是客户与互联网的互动,而不是谷歌或雅虎后端的性能/吞吐量。 – RussS
(测量是交互作用)当它在本地运行时如何?是否认真?我使用了多线程插入。但是我重申的是MongoDB和Mysql在插入方面的表现比Cassandra更好。对于10000插入或说100000插入(通过X线程),延迟比MySQL或MongoDB要慢得多。这就是我的意思!顺便说一句,MongoDB,Mysql或Cassandra没有任何调整。我已经阅读了很多文章,没有任何性能调整可以根据Cassandra的插入进行。 – avijendr