`
shibin_1109
  • 浏览: 79439 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MongoDB与传统数据库的使用区别——批量插入与批量查询

阅读更多
我在百X知道上回答问题时经常遇到类似与这样的问题:MongoDB有没有像MySQL一样的ODBC驱动?MongoDB能不能像MySQL一样获取字段名称或类型。
我的回答是:不行,因为MongoDB不是MySQL。这个回答显得MongoDB太弱了,我的原意是你不能要求一个物理优秀教师帮你辅导数学,也许他能做到基本的教学,但他很难做到优秀数学教师那么全面。

今天讨论的问题是:批量插入和批量查询
昨天在百X知道上有人问起MongoDB的批量插入如何写,这个我还真没用过,一方面MongoDB的速度足够快让我从来没有想过去找这种方法,另一方面MongoDB的官网以及API里也找不到这种方法。
那就带来两个问题。
问题1:这样岂不是没有速度更快的批量插入么?
这个问题毫无技术含量,MongoDB怎么可能会比MySQL慢?这里还是涉及到大家经常用到的传统关系型数据库和NoSQL的本质区别问题,NoSQL的每次操作都非常轻量级,小型化,除了数据的写入外基本没有多余的操作。再举个栗子:MongoDB就是放东西(数据)时把东西扔入相应的柜子(数据库)即可,而MySQL则要保持与送东西人的沟通(双向连接保持),东西的折叠整理分格存储(事务+有模式)。MySQL的批量插入就是减少了沟通以及分格等过程,而MongoDB本身就不存在这些过程,因此MongoDB就不存在批量插入这个概念了。结论就是,MongoDB的普通插入比MySQL的批量插入还要快,或者说MongoDB的普通插入就是批量插入。
问题2:把多个操作放入一个事务里一起执行不就不能实现了?
这个问题更没有技术含量了,MongoDB有事务么?还是那句,不要把NoSQL当关系型数据库用。那岂不是MongoDB的数据完整性和数据安全性会很差?这个,还得再重复一遍,MongoDB的设计是为了处理大规模数据的,所以对数据完整性要求不是那么严格。如果非要较真儿的话,MongoDB也可以处理这种情况,就是getLastError,它会牺牲性能以获取数据操作是否正确,你可以在批量插入一批数据后调用一次这个方法,如果出错,就把这批数据重新操作一遍,一批调用getLastError一次,既可保证性能,又可保证数据安全。

批量查询
再来说一下批量查询,这里的批量对应于官网上的batch select的概念,可以理解为一次查询一批数据。很多人在使用数据库的时候会用:
Statement stmt = a.createStatement();
ResultSet rs = stmt.executeQuery(sql);
for(int i = 1; i < 10000; i++){
         //read data from rs
}
这样操作,会把数据库中的数据全部读入内存还是每条数据都去数据库中读一次?实际上两者都不是,MySQL会把部分数据放入内存,如果这部分数据读完了,那么再读入一部分。因为很久没用MySQL了,我记得C++的驱动中确实有一个类是用于把全部数据都读入内存的,不过这种方法很少人使用。
MongoDB的查询是这样的,你用Cursur去查询,如果没有设置batch size这个参数,那么MongoDB默认会返回101条数据,等到这101条数据读完了,也就是说用户想读第102条数据,那么驱动会再次去MongoDB中获取后面的一批数据,这批数据不是以个数记的,而是最大限制4M的大小,将这4M的数据返回供用户继续读,读完再申请4M。当然,你可以通过batch size来改变这一数值,如果设置了,那么每次返回都会返回batch size条数据。
转自:http://blog.sina.com.cn/s/blog_56545fd301013zav.html
分享到:
评论

相关推荐

    各种数据库特性及比较

    它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。MongoDB 的特点包括: * 使用语言:C++ * 特点:保留了 SQL 一些友好的特性(查询、索引) * 使用许可:AGPL 协议 * 协议:Custom, binary(BSON) * ...

    MongoDB笔记.docx

    MongoDB是一款开源的NoSQL数据库系统,与传统的关系型数据库不同,它采用了一种灵活的数据模型——文档模型,这使得它在处理半结构化和非结构化的数据时非常高效。MongoDB的文档是以BSON格式存储的,BSON是一种类似...

    mongodb可视化工具

    MongoDB是一款广泛应用于现代数据存储和管理的NoSQL数据库系统,以其灵活性、可扩展性和高性能而...通过其丰富的功能和直观的操作界面,无论是开发者还是数据库管理员,都能从中受益,更好地管理和维护MongoDB数据库。

    php_mongoDB的拓展dll文件v5.2-5.3

    这个扩展使得PHP代码能够与MongoDB数据库进行交互,执行查询、插入、更新和删除等操作。 标题"php_mongoDB的拓展dll文件v5.2-5.3"指出这是一个适用于PHP版本5.2到5.3的MongoDB扩展的动态链接库(DLL)文件。DLL是...

    Sync Clickhouse with MySQL/MongoDB.pdf

    然而,随着数据量的增长和业务需求的变化,ClickHouse在与MySQL和MongoDB等传统关系型数据库或NoSQL数据库同步时面临挑战。 挑战主要包括复杂的数据源、频繁的数据更新和删除。由于ClickHouse的设计并不支持频繁的...

    MongoDB时序的设计与应用

    与传统集合不同,时序集合能够自动根据时间顺序组织数据,从而显著提高插入和查询时序数据的效率。 #### 数据桶模式 为了更好地理解时序集合的工作原理,首先介绍其核心概念之一:数据桶模式(Bucket Mode)。数据...

    玩转MongoDB4.0从入门到实践、MongoDB基本操作之CRUD、进阶之聚合、中索引的重要性、数据分片

    使用`insertMany`批量插入多个文档。 2. **查询文档**:通过`find`或`findOne`方法查询文档;使用`aggregate`实现复杂查询。 3. **更新文档**:使用`update`或`updateOne`命令修改现有文档;利用`$set`操作符设置...

    MongoDB测试javaweb项目demo

    MongoDB是一个高性能、开源、无模式的文档型数据库,它属于NoSQL数据库家族,特别适合处理海量数据和高并发的Web应用。在Java Web开发中,MongoDB与Java驱动程序结合,可以提供灵活且强大的数据存储解决方案。本项目...

    php mongodb 5.2

    连接MongoDB数据库是第一步,你可以使用`MongoDB\Driver\Manager`类创建一个连接实例。例如: ```php $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017"); ``` 在连接成功后,可以创建`MongoDB\...

    SQLite-and-MongoDB-Projects

    7. 大数据操作:在MongoDB中处理大量数据,如批量插入、聚合查询等。 8. 数据备份与恢复:学习如何备份和恢复SQLite与MongoDB数据库,确保数据安全。 9. 数据迁移:在不同数据库之间迁移数据,了解数据格式的转换...

    计算机软件-商业源码-260 转换数据库.zip

    6. 事务管理:确保数据的一致性,通常在批量插入或更新时使用事务。 7. 性能优化:通过索引、批量操作等方式提升转换速度。 8. 安全性:确保数据在传输和转换过程中的安全,可能涉及加密和权限管理。 9. 测试和验证...

    实用的MongoDB连接工具

    MongoDB是一种流行的开源、分布式文档数据库,以其灵活性、高性能和易用性而受到广大...其丰富的功能和友好的界面设计,使得无论是初学者还是经验丰富的数据库管理员,都能快速上手,更好地管理和利用MongoDB数据库。

    elixir-mongodb-driver:Elixir的MongoDB驱动程序

    `elixir-mongodb-driver` 是一个专门为Elixir编程语言设计的MongoDB驱动程序,它允许Elixir应用与MongoDB数据库进行无缝交互。这个驱动程序提供了丰富的功能,涵盖了从基本的数据查询到复杂的数据库操作。 ### 1. ...

    GetPoetry.zip

    本实例中,我们探讨的是如何使用Go语言来实现批量下载古诗,并将这些数据存储到MongoDB数据库中。通过分析“GetPoetry.zip”这个压缩包,我们可以深入理解Go语言在网络爬虫和NoSQL数据库操作上的应用。 首先,...

    mongodb4noobs:在MongoDB上为初学者回购

    MongoDB提供了一种强大的查询语言——MQL(MongoDB Query Language),它允许使用类似SQL的语法来查询和过滤数据。你可以根据字段值、条件和逻辑操作符进行查询,还可以使用聚合框架进行复杂的分析操作。 操作方面...

    Python库 | pymongo-3.11.0-cp27-cp27m-manylinux1_i686.whl

    《Python库pymongo-3.11.0:连接MongoDB数据库的高效工具》 在Python编程领域,数据管理是至关重要的环节,而MongoDB作为一款强大的文档型数据库,被广泛应用于各种项目中。为了方便Python开发者与MongoDB进行交互...

    Web_006.zip

    在这个名为"Web_006.zip"的压缩包中,我们似乎找到了一个与Web应用程序相关的项目,它可能包含了实现基本的数据库操作——增、删、改、查(CRUD)的功能,而且没有依赖任何特定的框架。这样的设计通常意味着开发者...

    mysql postgresql Greenplum 实时同步

    2. **DELETE+COPY方式**:不同于传统的INSERT+UPDATE+DELETE模式,Bireme利用DELETE+COPY机制,在插入新数据之前先删除旧数据中的主键对应的记录,之后再执行插入操作,以实现更高效的同步过程。 3. **支持多种数据...

Global site tag (gtag.js) - Google Analytics