1.为何要使用mongodb数据库或者说他有什么优势? 高性能,高可用,易扩展,丰富的查询语言,面向文档html
2.文档 至关于 行,键只能是字符串类型node
数据库 -》集合-》文档-》键,值 db col doc 查找数据库某个集合的全部文档 db.col.find()sql
删除数据库某个集合的全部文档 db.col.remove({})mongodb
删除某个文档,name属性值为sandy的文档 db.col.remove({"name":"sandy"})数据库
3.数据库bash
一个文档
product_id : 1
version: 1.0
测试:
err = collection.Find(bson.M{"product_id": "2"}).All(&versions)
i := len(versions)
结果:
err = nil i=0 All函数找不到符合的
复制代码
4.两个文档并发
product_id : 1
version: 1.0
product_id : 1
version: 1.1
测试:
err = collection.Find(bson.M{"product_id": "1"}).One(&versions)
结果:
不会报错,只会返回其中一个文档
复制代码
5.两个文档函数
product_id : 1
version: 1.0
product_id : 1
version: 1.1
测试:
err = collection.Find(bson.M{"product_id": "2"}).All(&versions)
结果:
不会报错,数量为0
复制代码
总结:想知道数据库有没有这个数据,使用Count(),为0的话表明没有这个数,不存在
性能
MongoDB的事务
首先咱们须要知道MongoDB是有多种存储引擎的,不一样的存储引擎在实现ACID的时候,使用不一样的机制。而Mongodb从3.0开始默认使用的是WiredTiger引擎,本文后续全部文字均是针对WiredTiger引擎。 WiredTiger引擎能够针对单个文档来保证ACID特性,可是当须要操做多个文档的时候没法保证ACID,也即没法提供事务支持测试
Mongodb使用读写锁来来控制并发操做:
当进行读操做的时候会加读锁,这个时候其余读操做能够也得到读锁。可是不能或者写锁。 当进行写操做的时候会加写锁,这个时候不能进行其余的读操做和写操做。 因此按照这个道理,是不会出现同时修改同一个文档(如执行++操做)致使数据出错的状况并且按照这个道理,由于写操做会阻塞读操做,因此是不会出现脏读的
【索引】 数据库索引的本质是空间换时间
上文说过通常使用磁盘I/O次数评价索引结构的优劣。先从B-Tree分析,根据B-Tree的定义,可知检索一次最多须要访问h个节点。数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每一个节点只须要一次I/O就能够彻底载入。为了达到这个目的,在实际实现B-Tree还须要使用以下技巧:
每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。
B-Tree中一次检索最多须要h-1次I/O(根节点常驻内存),渐进复杂度为O(h)=O(logdN)。通常实际应用中,出度d是很是大的数字,一般超过100,所以h很是小(一般不超过3)。(h表示树的高度 & 出度d表示的是树的度,即树中各个节点的度的最大值)
综上所述,用B-Tree做为索引结构效率是很是高的。
而红黑树这种结构,h明显要深的多。因为逻辑上很近的节点(父子)物理上可能很远,没法利用局部性,因此红黑树的I/O渐进复杂度也为O(h),效率明显比B-Tree差不少。
上文还说过,B+Tree更适合外存索引,缘由和内节点出度d有关。从上面分析能够看到,d越大索引的性能越好,而出度的上限取决于节点内key和data的大小:
dmax=floor(pagesize/(keysize+datasize+pointsize))
floor表示向下取整。因为B+Tree内节点去掉了data域,所以能够拥有更大的出度,拥有更好的性能。
复制代码
B树
一棵m阶的B-Tree有以下特性:
1. 每一个节点最多有m个孩子。
2. 除了根节点和叶子节点外,其它每一个节点至少有Ceil(m/2)个孩子。
3. 若根节点不是叶子节点,则至少有2个孩子
4. 全部叶子节点都在同一层,且不包含其它关键字信息
5. 每一个非终端节点包含n个关键字信息(P0,P1,…Pn, k1,…kn)
6. 关键字的个数n知足:ceil(m/2)-1 <= n <= m-1
7. ki(i=1,…n)为关键字,且关键字升序排序。
8. Pi(i=1,…n)为指向子树根节点的指针。P(i-1)指向的子树的全部节点关键字均小于ki,但都大于k(i-1)
复制代码
B+树
B+Tree相对于B-Tree有几点不一样:
非叶子节点只存储键值信息。
全部叶子节点之间都有一个链指针。
数据记录都存放在叶子节点中
复制代码