环境:部署standalone模式,有140万条记录;目标:计算查询时间。
操作过程:使用 “sdb -f 用例文件” 来运行测试用例,time来统计时间。
具体用例:
测试用例
Sequoiadb
var db = new Sdb();
var cursor = db.test.coll.find({"gender":"男"},{"name":1});
while (cursor.next()) {
print(cursor.current());
}
1、查询怎么花费这么久,竟达8分钟多?
2、如何改善?
{"gender":"男"}为条件是不是会取到一半或者一半以上的记录,这个查询条件的选择是基于什么考虑的呢?其次计时并不全都是查询操作耗时,还包括客户端print(cursor.current());这种操作的耗时。
我们的目的是想对比市面上的数据库产品的性能,如MongoDB,同样的语句却比巨杉快一半,让我们有点意外。想咨询下。对于数据量比较大、记录比较多的情况下,巨杉数据库的查询耗时怎么样?你们有没相关的测试结果?
sdb shell是基于spidermonkey引擎封装了javascript语法。而这种做法仅限于提供一个简单的管理工具。不能作为性能测试的指标。比如一个简单的查询可能在引擎耗时10ms,在sdb shell可能耗时100ms。最终上线是不可能用sdb shell进行业务操作的。我相信mongo也存在这个问题。如果想测试性能,还是推荐使用loadrunner等专业的测试工具。
再请教下,为何在shell里count竟也等待时间这么长,如: db.test.coll.count({"gender":"男"}); 花了9分钟左右?而MongoDB所有的count都是在1s以内就统计出结果的?
你们不测试查询耗时吗?有没一些结果可发出来看看?
你上面的count可以把db.test.coll.find({gender:“男"}).explain({Run:true})的结果发出来看看。同时如果可以的话把mongo的访问计划也贴出来看看。
至于查询耗时,一般来说精确查询在30ms以内算是比较正常的。单并发这种一般在10ms以内。
db.test.coll.find({gender:“男"}).explain({Run:true})的结果:
索引的用途是从很多记录里找到少量的记录。这里这种走索引扫描返回结果是全部索引的内容是不适合用索引的。在这个场景下即使mongo比sdb快一倍也说明不了问题,真正的场景里不可能这么用。而且看你的访问计划,60w的数据量跑了480s。硬件的配置应该相当差。在硬件使用上面可能mongo的使用率更高,导致速度比较快。
我估计你在sdb上把索引删了搞不好比没有索引还快一些。可以删除后再跑一次访问计划,看看ElapsedTime是否有下降。