MongoDB介绍
MongoDB是一个可扩展、高性能的下一代数据库。MongoDB中的数据以文档形式存储,这样就能在单个数据对象中表示复杂的关系。文档可能由以下几 部分组成:独立的基本类型属性、“内嵌文档”或文档数组。
这样的灵活性让开发者能以一种易于管理且灵活的方式来对大量的问题进行建模,不必将数据打散到不同的数据表中。在数据不宜被构造成单独文档的情况 下,MongoDB有“DBRef”的概念,这是从文档的一个属性指向另一个文档的指针。
从MongoDB数据库中获取和查询数据是十分灵活的——可以基于主文档、文档中的任意属性、任意内嵌文档、数组中的任意文档来动态地查询文档。可以通过 “点”符号来访问内嵌文档。
MongoDB特性
MongoDB 是一个可扩展的,高性能,开源,模式自由,面向文档的数据库.使用C++编写,MongoDB特点:
面向文档存储(类JSON数据模式简单而强大)
动态查询
全索引支持,扩展到内部对象和内嵌数组
查询记录分析
快速,就地更新
高效存储二进制大对象 (比如照片和视频)
复制和故障切换支持
Auto-Sharding自动分片支持云级扩展性 (alpha阶段)
MapReduce 支持复杂聚合
商业支持,培训和咨询
MongoDB 在键值存储(快速并有高扩展性) 和传统 RDBMS 系统(提供结构化模式和强大的查询)之间建立了一个桥梁.
操作与可扩展性
从操作角度来讲,MongoDB可以根据应用程序的需要以两种模式来运行。第一种是“单主”(single master)模式,只有一台主服务器来处理所有的写操作。读操作能从中分离出去,通过任意数量的从服务器来进行读操作,这有利于提高读的可扩展性(使用场景:Sourceforge)。
对于那些写数据量很大或写频率过高,单台主服务器无法处理的应用程序,可以使用MongoDB的自动分片模式(正处于alpha阶段)。该模式下写操作会自动分配到任意数量的“片”中(一般是一台或一组MongoDB服务器),它们负责这部分数据集的写和读。
无论使用哪种模式,MongoDB都会采取“强一致性”方法(你可以把MongoDB看成CAP理论中的C-P系统)。高可用性是通过将数据复制到多个MongoDB节点来实现的,每个节点都能及时成为一个分片的主服务器——MongoDB会自动处理故障转移。这能让你在维持相当高的写可用性的同时,拥有强一致性特性,这对一些用例来说非常重要。
安装与集成
支持Linux、MacOS X、Windows和Solaris
几乎所有编程语言中支持MongoDB。它有多种语言的驱动:C、C++、C# & .NET, ColdFusion、Erlang、Factor、Java、Javascript、PHP、Python、Ruby、Perl,等等
MongoDB本身以mongod守护进程的形式运行,这是核心数据库服务器,随后通过多种驱动来访问它。分片支持和数据库路由功能由mongos 服务来提供。
Linux下安装启动
- $wget http://downloads.mongodb.org/linux/mongodb-linux-i686-latest.tgz
- $tar zxvf mongodb-linux-i686-latest.tgz
- $cd mongodb-linux-i686-latest
- $bin/mongod run
- $ /bin/mongo
windows下安装启动
下载解压
建立数据目录:d:/wamp/data
命令行下启动服务,进入bin目录
- mongod.exe --dbpath= d:/wamp/data --port 12345
启动自带客户端
- mongon.exe
Linux下安装PHP扩展
Ubuntu下
- sudo pecl install mongo
(使用pecl 要安装php5-pear,php5-pear可用apt-get安装)
也可以官网上下载源码自行编译安装
修改 extension=“mongo.so”
Windows下安装PHP扩展
下载PHP-mongodb扩展http://cn.php.net/manual/en/mongo.installation.php#mongo.installation.nix
解压后将php_mongo.dll存放到php\ext\文件夹下.
在php.ini配文件中加入extension=php_mongo.dll
MongoDB PHP API 及用法
- <?php
- //这里采用默认连接本机的27017端口,当然你也可以连接远程主机如192.168.0.4:27017
- $m = new Mongo();
- // 选择comedy数据库,如果以前没该数据库会自动创建,也可以用$m->selectDB("comedy");
- $db = $m -> comedy;
- //选择comedy里面的collection集合,相当于RDBMS里面的表,也-可以使用 $db-selectCollection("collection");
- $collection = $db->collection;
- //添加一个元素
- $obj = array( "title" => “Juest a test", "author" => “LuohuiZhu" );
- $collection->insert($obj); //将$obj 添加到$collection 集合中
- //添加另一个元素
- $obj = array( "title" => “test again", “ok" => true );
- $collection->insert($obj);
- $cursor = $collection->find();
- //遍历所有集合中的文档
- foreach ($cursor as $obj) {
- echo $obj["title"] . "\n";
- }
- $m->close(); //断开MongoDB连接
- ?>
i常用操作
- $query = array( "i" => 71 );
- $cursor = $collection->find( $query ); // 在$collectio集合中查找满足$query的文档
- while( $cursor->hasNext() ) {
- var_dump( $cursor->getNext() );
- }
- $collection -> findOne(); //返回$collection集合中第一个文档
- $collection -> count(); //返回$collection集合中文档的数量
- $coll->ensureIndex( array( "i" => 1 ) ); // 为i “这一列”加索引 降序排列
- $coll->ensureIndex( array( "i" => -1, "j" => 1 ) ); // 为i “这一列”加索引 降序排列 j升序
- $person = array("name" => "joe");
- $people->insert($person);
- $joe = $people->findOne(array("_id" => $person['_id']));
- $collection->update($criteria, array('$set' => array("comments.1" => array("author" => "Jim")))); //$criteria 为要更新的元素
- 列出所有可用数据库
- $m->listDBs(); //无返回值
- //删除一个数据库
- $m -> dropDB("comedy");
更多API和用法请参考API手册
性能测试(写)
插入100000条数据,花费时间3秒
性能测试(读)
读取100000条数据,花费时间2秒
网上的一些测试结果
记录很少的时候每秒写入5000条左右
记录很少的时候基于索引的搜索每秒2000条左右
数据很少的时候读每秒1400条
数据很少的时候4M数据获取大概237毫秒
数据很少的时候搜索对写入影响不大
数据很少的时候读写相互影响不大
数据很多的时候
写入速度下降一半
读取速度没区别
搜索慢了很多,千万数据下查询1000条数据花费200毫秒左右,2个字段
读取对写入影响还是不大
查询对写入影响很大
另不管数据量多少CPU始终在10%以下,内存随着数据量增多从20% - 80%
MongoDB GUI工具
PhpMoAdmin http://www.phpmoadmin.com/
Opricot http://www.icmfinland.fi/oss/opricot/
参考资料
http://www.php.net/manual/en/mongo.tutorial.php
http://us2.php.net/mongo
http://www.mongodb.org/display/DOCS/PHP+Language+Center
- <?php
- $start_time = time();
- echo '开始时间:'.date('H:i:s',$start_time).'<br />';
- $m = new Mongo("127.0.0.1:27017");
- $collection = $m->test;
- $c = $collection->user;
- $data = $c->find();
- foreach ($data as $d) {
- //print_r($d) ;
- }
- $m->close();
- $end_time = time();
- echo '结束时间:'.date('H:i:s',$end_time).'<br />';
- echo "读取100000条数据,花费时间是:".($end_time - $start_time)."\n".'秒';
- ?>
- <?php
- $start_time = time();
- echo '开始时间:'.date('H:i:s',$start_time).'<br />';
- $m = new Mongo("127.0.0.1:27017");
- $collection = $m->test;
- $c = $collection->user;
- $num = 100000;
- $data = array();
- for($i=1;$i<=$num;$i++){
- $data = array('uid'=>$i,'username'=>'ChunTian_'.$i);
- $c->insert($data);
- }
- $m->close();
- $end_time = time();
- echo '结束时间:'.date('H:i:s',$end_time).'<br />';
- echo "插入100000条数据,花费时间是:".($end_time - $start_time)."\n".'秒';
- ?>







