在周末,我尝试了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)适用于所有三个数据库。 结构(对于所有四个数据库)
+--------------+---------------------+
| 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) |
+--------------+---------------------+
数据库/环境详情
- MySql 5.6(64位)带有mysql java connector 5.1.28
- Apache Cassandra 2.0带有datastax 2.0 Java驱动程序
- MongoDB 2.4.6带有mongo Java驱动程序2.12.0
- Redis 2.8.17运行在Linux机器上
- Oracle Java 1.6(64位)
- Microsoft Windows 7(64位)
- Intel i3 core 2.30 GHz处理器
- 8GB RAM
创建了一个简单的Java测试用例,以下是我得到的结果(虽然数字不一致,但延迟基本相同):
100,000条记录
- MySql 1000,000 - 46秒
- Cassandra - 54秒
- MongoDb - 2秒
500,000条记录
- MySql 1000,000 - 142秒
- Cassandra - 299秒
- MongoDb - 41秒
1,000,000条记录
- MySql 1000,000 - 349秒
- Cassandra - 699秒
- MongoDb - 51秒
- Redis - 34秒
我的问题是,为什么Cassandra对于这样一个小而简单的表插入需要这么长时间?
在Cassandra中,我尝试了内联循环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);
我使用insert的内联循环如下:
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
现在为什么Cassandra比MySQL慢,更重要的是 - 为什么 MongoDB比Cassandra快得多?我真的希望我做错了什么?
是否有一种方法可以像MongoDB一样直接向Cassandra插入JSON/BSON对象?我猜这可能会让它更快?能否请一些专家帮助我解决这个问题?如果没有答案,我会得出结论:MongoDB比Cassandra更好!