Mongodb

来源:互联网 发布:.com.cn域名好吗 编辑:程序博客网 时间:2024/04/26 01:15

一、Mongodb简介

1.mongodb特性

Mongo是一个高性能,开源,模式自由(schema-free)的文档型数据库,它在许多场景下可用于替代传统的关系型数据库或键/值(key-value)存储方式。Mongo使用C++开发,具有以下特性:

面向集合的存储:适合存储对象及JSON形式的数据。

动态查询:Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。

完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。

查询监视:Mongo包含一个监视工具用于分析数据库操作的性能。

复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。

高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)。

自动分片以支持云级别的伸缩性(处于早期alpha阶段):自动分片功能支持水平的数据库集群,可动态添加额外的机器。

模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。

存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各中复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized dOcument Format)。

MongoDB服务端可运行在Linux、Windows或OS X平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。

MongoDB把数据存储在文件中(默认路径为:/data/db),为提高效率使用内存映射文件进行管理。

MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。

2.适用场景

网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。

缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。

大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。

高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapReduce引擎的内置支持。

用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。

3.不适用场景

高度事务性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。

传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。

二、Mongodb 安装

1.mongodb 下载

64位下载:

$wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.6.5.tgz

32位下载:

$wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.8.1.tgz

2.解压

// 解压

$tar zxvf  mongodb-linux-x86_64-1.6.5.tgz

// 修改文件夹名词

$mv  mongodb-linux-x86_64-1.6.5  mongodb

// 建立数据库存储路径

$mkdir -p /mongodb/db 

// 建立日志存储路径

$mkdir -p /mongodb/log

3.启动服务

启动服务器 dbpath默认(/data/db)

$./mongodb/bin/mongod --dbpath=/mongodb/db --logpath=/mongodb/log/log.log &

说明:

dbpath:指定数据库目录

logpath:指定日志文件

4.连接服务

连接服务器(默认端口27017)

$./mongodb/bin/mongo

例如:

说明:默认连接test数据库

其他方法:

show dbs // 列出所有数据库

use test // 使用数据库test ,即使这个数据库不存

在也可以执行,但该数据库不会立刻被新建,要等

到执行了insert之类的操作时,才会建立这个数据

show collections // 列出当前数据库的所有文档

db // 显示当前数据库

三、PHPmongodb基本操作

1.建立连接

$conn = new Mongo();//得到一个Mongo连接,默认连接localhost:27071

如果连接到其他主机,可以写为:

$conn = new Mongo(“mongodb://192.168.1.206:27071”);

说明:php使用Mongo的时候,不用需要引入任何文件

2.选择数据库

$conn = new Mongo();

$db = $conn->test();或$db= $conn->selectDB(“test”);

说明:

在连接数据库或者集合操作时,不需要先判断数据库或集合是否存在,当不存在时,Mongodb会根据连接的名称,自动创建。

Mongodb不需要我们创建数据库或者集合.在你插入数据的时候会自动创建相关的数据库跟集合.

3.选择集合

$conn = new Mongo();

$db = $conn->selectDB(‘test’);

第一种方式:

$coll = $db->collectionName;

第二种方式

$coll = $db->selectCollection(“collectionName”);

4.插入数据

Public mixed MongoCollection::insert(array $a[, array $options = array()])

MongoCollection::insert(array $a, array $option );

Array $a 要插入的数组

Array $option 选项

safe 可以使布尔或者整形,默认为false。如果是false,则不会接受响应信息,如果是true,当执行失败的时候会返回MongoCursorException类型的信息

fsync布尔类型,默认是false是否直接插入大物理硬盘

timeout整形,超时时间,单位ms,默认20000ms

返回值:

如果safe设置的话,则返回一个数组包含插入信息

没有设置options实例:

$conn = new Mongo();

$db = $conn->test();

$coll = $db->selectCollection(“collectionName”);

$obj = array("title" => "java", "author" => "zhangsan");

$coll->insert($obj);

设置options实例:

$conn = new Mongo();

$db = $conn->test();

$coll = $db->selectCollection(“collectionName”);

$obj = array("title" => "java", "author" => "zhangsan");

$result = $coll->insert($obj, array(‘safe’ => true));

echo”<pre>”;

print_r($result);

显示结果:

Array

(

    [err] => 

    [n] => 0

    [ok] => 1

)

5.查找

Public MongoCursor MongoCollection::find([array $query=array()[, array $fields=array()]])

Query:查询条件

Fields:返回集合中字段

1).全部查找实例:

$ cursor = $coll->find();//返回一个光标

$result = iterator_to_array($cursor);//获取所有数据

2)指定值查找实例:

$conn = new Mongo();

$db = $conn->test;

$coll = $db->selectCollection(“collectionName”);

// 查找条件

$where = array(‘title’ => ‘java’);

$coll->find($where);

3)范围查找

// search for documents where 5 < x < 20

$conn = new Mongo();

$db = $conn->test;

$coll = $db->selectCollection(“collectionName”);

$rangeQuery = array('x' => array( '$gt' => 5, '$lt' => 20 ));
$cursor = $coll->find($rangeQuery);

4)范围查找实例

$conn = new Mongo();

$db = $conn->test;

$coll = $db->selectCollection(“collectionName”);

s = $coll->find(array(
  'type' => array('$in' => array('homepage', 'editorial'))
));

6.删除

MongoCollection::remove([$array $criteria[, array $options]])

Array $criteria 条件

Array $options 返回信息设置

实例:

$conn = new Mongo();

$db = $conn->test;

$coll = $db->selectCollection(“collectionName”);

$result = $coll->remove(array(“title” =>”java”), true);

返回信息

Array

(

    [err] => 

    [n] => 2

    [ok] => 1

)

7.更新

MongoCollection::update(array $criteria, array $newobj[, array $options = array()])

$conn = new Mongo();

$db = $conn->test;

// 选择一个集合

 $coll = $db->selectCollection("student");

 $coll->insert(array('firstname'=> 'Bob', 'lastname' => 'Jones'));

//更新内容

$newdata = array('$set'  =>array("address"=>"1 Smith Lane"));

$coll->update(array("firstname" => "Bob"), $newdata);

        $result = $coll->findOne(array('firstname' => "Bob"));

echo "<pre>";

var_dump($result);

运行结果:

array(3) {

  ["_id"]=>

  object(MongoId)#6 (1) {

    ["$id"]=>

    string(24) "4dbfa038a66d2a4f06000003"

  }

  ["firstname"]=>

  string(3) "Bob"

  ["lastname"]=>

  string(5) "Jones"

}

四、测试经过

测试地址 192.168.1.205

测试代码192.168.1.205

/www/webroot/mongo/insert.php

/www/webroot/mongo/select.php

/www/webroot/mongo/update.php

测试工具:

Apache的ab命令

例如:

cd /usr/local/webserver/apache2/bin

$ ./ab -n 800000 -c 400  http://localhost/mongo/update.php

Mongodb地址:192.168.1.206:27017

测试服务器状况

测试服务器

cpu

内存大小

可用空间

192.168.1.205

0.0%

30%

46G

192.168.1.206

0.1%

10%

11G

1.insert测试

请求数

并发数

完成时间(s)

成功率

每秒完成事务数(s)

每并发平均时间ms

平均响应时间(ms)

每秒并发数

1000

1

4.533

100%

220.60

4.533

10000

1

60.407

100%

165.54

6.04

10w

1

1013.901

100%

98.63

10.139

10w

10

167.271

100%

597.83

1.673

10w

20

153.006

100%

653.57

1.530

30.601

653

100w

20

1778.988

100%

562.12

1.779

35.580

562

10w

200

181.433

100%

551.17

1.814

362.866

551

100w

100

2298.464

100%

435.07

2.298

229.846

435

40w

25

827.097

100%

483.62

2.068

51.69

483

20w

50

442.223

100%

452.26

2.211

110.556

453

10w

100

182.117

100%

549.10

1.821

182.117

549

5w

200

78.367

100%

638.03

1.567

313.466

638

5w

300

84.244

100%

593.51

1.685

505.466

593

5w

250

90.241

100%

554.07

1.805

451.204

554

5w

400

81.254

100%

615.35

1.625

650.033

615

5w

500

67.876

100%

736.63

1.358

678.765

736

5w

600

120.016

100%

416.61

2.400

1440.195

377

5w

550

132.307

100%

377.91

2.646

1455.381

377

5w

500

 93.977

100%

532.05

1.880

939.767

531

5w

600

122.966

100%

406.62

2.459

1475.591

409

10w

500

183.520

100%

 544.90

1.835

917.60

554

100w

500

5%

每秒最大并发数:736

每秒最小并发数:377

每秒平均并发数:533

注释:

黄色标示的为:测试每秒并发量最大

红色标示的为:测试每秒并发量最小

2.select测试

请求数

并发数

完成时间(s)

成功率

每秒完成事务数(s)

每并发平均时间ms

平均响应时间(ms)

每秒并发数

100w

500

完成1%

10w

500

50.574

100%

1977.30

0.506

252.870

1976

20w

500

100.941

100%

1981.35

0.505

252.353

1980

30w

500

158.324

100%

1894.85

0.528

263.873

1893

40w

500

250.617

100%

1596.06

0.627

313.271

1594

50w

500

243.461

100%

2053.71

0.487

243.461

2053

60w

500

285.589 

100%

2100.92

0.476

237.991

2114

60w

600

290.687

100%

2064.08

0.484

290.687

2066

70w

600

342.388

100%

2044.46

0.489

293.475

2044

80w

600

392.477

2038.34

0.491

294.357

2024

每秒最大并发数:2114

每秒最小并发数:1594

每秒平均并发数:1971

注释:

黄色标示的为:测试每秒并发量最大

红色标示的为:测试每秒并发量最小

3.update测试

请求数

并发数

完成时间(s)

成功率

每秒完成事务数(s)

每并发平均时间ms

平均响应时间(ms)

每秒并发数

10w

600

10%

10w

400

212.176

471.31

2.122

848.705

471

10w

500

30%

20w

500

50%三次

20w

400

480.929

100%

415.86

2.405

961.858

405

30w

400

714.848

100%

419.67

2.383

953.130

419

40w

400

985.557

100%(两次40%)

405.86

2.464

985.557

405

50w

400

1185.357

100%

421.81

2.371

948.286

421

60w

400

1404.762

100%

427.12

2.341

936.508

427

70w

400

1720.675

100%(4%一次)

406.82

2.458

983.243

406

80w

400

2032.046

100%

393.69

2.540

1016.023

393

每秒最大并发数:471

每秒最小并发数:393

平均并发数:418

注释:

黄色标示的为:测试每秒并发量最大

红色标示的为:测试每秒并发量最小

五、测试总结

insert每秒达到最大并发数为736,最小并发数为377.select每秒达到的最大并发数为2114,最小并发数为1594.update每秒达到的最大并发数为471,最小并发数为393。通过以上数据可以得到平均每秒最大并发数为1107,平均最小并发数为788.

原创粉丝点击