为什么对于这个查询,SQL Server 2012比MongoDB更快?

7
我正在对SQL Server 2012和MongoDB 2.4.9进行性能测试。我在网上做了一些研究,发现许多比较只比较这两个数据库之间的插入性能。我只对没有索引的select性能感兴趣。我设置了一个非常简单的测试。以下是规格: SQL Server配置
  • 只设置一个整数字段的SQL Server。
  • 插入1百万个随机整数。
MongoDB配置
  • 有两个字段_id和id1。
  • 将1百万个随机整数插入到id1字段中。
当我插入数字时,它们完全相同地进入了两个数据库。随机数范围从1到1000。 SQL Server查询
select id from a101 where id > 995

MongoDB查询

var q = Query.GT("id1", 995);        
foreach (var i in collection.Find(q))
{
     values.Add(i.id1);
}

结果:

  • SQL Server:192毫秒
  • MongoDB:1109毫秒

对于我的模式,我不需要任何联接,只有非规范化数据 - 这就是为什么我考虑使用MongoDB的原因。在阅读在线基准测试后,我预计mongoDB比SQL Server快多次。我做错了什么吗?再次强调,我想进行未建立索引的测试。


3
太多的不平等现象。为什么会有不同的模式?如何衡量 SQL Server 查询?你读取查询结果了吗?在 MongoDB 查询中,值是哪种类型?为什么要循环遍历结果?等等... - Maarten
@WiredPrairie - 我可以理解你的观点,但在我的测试中,SQL Server 比 MongoDB 快了 5 倍。这一定有一个解释。而且,这是在我个人桌面上进行的测试,没有连接到网络。 - Luke101
听起来你期望MongoDB更快?为什么?另外,你的查询代码并不相同。你应该有更相似的代码。也许可以使用Linq并像你现在做的那样添加到列表中。 - WiredPrairie
2
抱歉如果你认为这很激烈——我只是认为这太宽泛了,因为你试图比较两种非常不同的数据库技术,而没有解释太多,并且不一定使用任何一种技术。例如,在我的电脑上完全在内存中完成的相同测试只需要2毫秒。 :) - WiredPrairie
@WiredPrairie - 实际上,对于这个测试,我选择不使用索引。我们将上传数千个CSV文件到数据库中。每个CSV将被上传到单独的集合或表中。我们将没有资源来索引特定字段。任何给定的CSV都可以包含几百条记录到少于一百万条记录。如果您知道如何在没有索引的情况下优化MongoDB,请告诉我。 - Luke101
显示剩余6条评论
1个回答

8

在这种情况下,MongoDB可能会慢五倍,因为它需要读取和输出五倍的数据。

你的SQL表中的一行只有4个字节。但在MongoDB中,它是一个4字节的整数加上一个12字节的ObjectId。此外,字段名称是每个单独文档的一部分。字符串_idid1是您检索的每个文档的一部分,因此会添加一些额外的字节。

而这只是实际有效载荷。当您查看BSONSpec.org时,可以看到您的文档由以下内容表示:

  • 4字节,用于32位整数,表示文档的总长度
  • 1字节0x01,表示“现在是一个ObjectId”
  • 4字节,用于空终止字符串_id
  • 12字节,用于ObjectId
  • 1字节0x10,表示“现在是一个32位整数”(最小的整数)
  • 4字节,用于空终止字符串id1
  • 4字节,用于32位整数
  • 1个尾随的0x00,标记文档的结尾

总共是31字节。


啊,那就有道理了。我会修改我的测试来解决这个问题。 - Luke101
因此,每行至少有12个字节加上其他字段。 - Ivan Juarez
@IvanJuarez 加上 4 个字节作为文档的总长度,1 个字节用于类型指示符 0x07(“这是一个对象ID”),4 个字节用于键名 _id(以空字符结尾的字符串),然后是 12 个字节的对象ID,最后再加上 1 个字节的结尾符 0x00,因此最小的文档至少需要 22 个字节。更多信息请参见:http://bsonspec.org/spec.html - Philipp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接