我最近开始为客户试用一些noSQL原型。他们有一个实时应用程序,该应用程序执行大量插入操作,但读取次数较少(当前他们使用的是MySql,并想尝试一些noSQL解决方案)
在周末,我尝试将Cassandra 2.0,MongoDB 2.4.9和Redis与普通的Mysql 5.5 DB进行比较。所有这些都在我的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) |
+--------------+---------------------+
数据库/环境详细信息
创建了一个简单的Java测试用例,这些是我得到的结果(尽管不一致的数字相同,但是延迟的方式几乎相同):
100,000条记录
500,000条记录
1,000,000条记录
我的问题是,为什么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);
我使用插入的内联循环是这样的
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
现在为什么Cassandara会比mysql慢并且更重要-为什么MongoDB会比Cassandra快得多?我真的希望自己做错了什么?
有没有办法像MongoDB一样将JSON / BSON对象直接插入到Cassandra中?我想这可能会加快速度吗?可以请一些专家帮助我吗?如果没有答案,我将得出结论,MongoDB比Cassandra更好!
您的代码正在使用串行插入。每个插入必须等待上一个插入完成并返回确认,然后才能开始下一个插入。这是对任何可以处理多个传入连接的数据库进行基准测试的不好方法。如果您确实不想使用execute_async(正确的方法),则应编写多线程压力程序,以使插入不会阻塞(在客户端),并且确实受到Cassandra节点的限制。基本上,您所看到的是客户端程序的运行速度,而不是数据库的功能。
博客文章兴趣点:
http://www.datastax.com/dev/blog/how-not-to-benchmark-cassandra
正确进行负载生成只有两个原则:
满足Cassandra足够的工作量在单独的计算机上生成工作负载就是这样!但这常常做错了,从与Cassandra一起在同一台笔记本电脑上运行的单线程客户端的极端情况到Python Global Interpreter Lock的更微妙的问题。似乎就像二进制搜索一样,构建一个好的负载生成器非常困难。如果可能的话,避免自己动手的诱惑,并使用经过考验的东西。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句