程序 = 算法 + 数据
外存储器存储数据: 文件,数据库
数据存储的发展
文件管理阶段(word excel)
优点:数据可长期保存,能存储大量数据。
使用一般比较简单
缺点:数据冗余大,数据一致性差,完整性难以维持。
查找修改不方便
数据库系统阶段
数据组织化结构好,冗余度变小,容易扩充,
方便程序自动处理。查找效率高
几个概念:
数据:能够输入到计算机并被识别和处理的信息集合
数据库:是按照数据结构组织,存储,和管理的仓库。
是在数据库管理系统管理和控制下存放在一定
介质上的数据集合
数据库管理系统:管理数据库的软件。用于建立,使用,
维护数据库结构内容。
数据库系统:是由数据库,数据库管理系统,开发工具等
共同构成的一个集合概念
关系型数据库
采用关系模型来组织数据结构的数据库
Oracle DB2 SQLServer MySql sqlite
优点:
* 容易理解
* 使用方便,通过sql语句操作,而sql语句是非常成熟的
* 易于维护,完整性好,降低了数据冗余,数据一致性高
* 通用化程度高,技术成熟,可以使用外联操作
缺点:
*无法很好满足高并发需求:数据的每次操作都需要sql
语句的解析,导致高并发下读写性能不足
*针对海量数据的瞬间爆发,数据库系统在性能上显得
力不从心,因为关系型数据库的每一步操作都需要加锁
* 扩展性不足。在关系型数据库中普遍难以横向扩展。当
数据增加到一定程度,现有数据库无法容纳很难通过添加
硬件和节点进行扩充。
非关系型数据库(NoSQL -》 not only sql )
优点:
* 高并发,大数据下的读写能力强
* 支持分布式,易于扩展
* 弱化数据结构,数据结构简单
缺点:
* 缺少join等复杂操作的功能
* 通用性差
* 结构的灵活也需要更灵活的操作,容易混乱,没有
标准的语句(类似于sql)
面试要求1 :能够描述关系型数据库和非关系型数据库的
优缺点
Nosql的使用情况
1.数据模型简单
2.对数据的一致性要求低
3.对数据库的并发处理性能要求高
4.对数据库的扩展性有一定需求
5.给定key可以比较方便映射数据结构
非关系型数据库的分类
*键值存储数据库
Redis 、oracle BDB 、Tokyo
* 列存储数据库
HBase
* 文档型数据库
键值型数据库的升级版,在原有数据存储基础上进行了扩充
Mongodb、CouchDB
* 图形数据库
要求:知道Nosql分为几类,mongo是哪一类
Mongodb
1.分布式的文档型NoSQL
2.由c++编写的
3.支持数据格式比较松散,是类似json的Bson格式
4.最类似与关系型数据库的非关系型数据库
{
field1:value1,
field2:value2,
....
fieldn:valuen,
}
特点:
* 高性能,易部署,存储方便
* 如果负载增加方便扩展
* 支持的查询操作相对其他Nosql非常丰富
* 支持众多编程语言接口(ruby,python,c++,c#,PHP)
* 使用bson格式存储存储微信朋友圈和评论
用户 朋友圈 评论表
mongodb数据库的安装
自动安装
sudo apt-get update
sudo apt-get install mongodb
那么默认数据库创建位置 /var/lib/mongodb
配置文件位置 /etc/mongodb.conf
mongo 命令位置 /usr/bin 这个目录一定是环境变量
手动安装
1.下载对应版本的 mongodb文件包
2.将文件包移动到某个目录下(/usr/local /opt)
3.解压文件包
tar -xvf mongodb-linux-x86_64-ubuntu1604-3.4.10.tgz
4. 解压后进入文件夹将bin目录添加到环境变量
在 /etc/bash.bashrc 加上
PATH=$PATH:/ect/local/mongdb-..../bin/
export PATH
或者在/etc/rc.local添加
5.添加后重启环境
source /etc/bash.bashrc
6.设置数据库默认路径
sudo mkdir -p /data/db
mongodb 命令
启动mongod服务
mongod --dbpath /xxx/yyy 指定数据库路径
--port 8888 指定端口号
----------------------------------------------------
启动mongo shell终端输入 mongo
注意:支持JavaScript代码
默认使用端口号27017
show dbs #查看库
mongo的一些概念
mysql mongodb 含义
database database 数据库
table collection 表/集合
row document 记录/文档
column field 字段/域
index index 索引
primary key primary key 主键 mongo中自动添加主键
-------------------
id | name | age
-------------------
1 | Lily | 10
-------------------
2 | Lucy | 11
-------------------
{
"_id":ObjectId("3j2k45hkjh2k3hj52"),
"name":"Lily",
"age":10
}
{
"_id":ObjectId("3j2k45hkasdf89as7"),
"name":"Lucy",
"age":11
}
-----------------------------------------------
数据库创建
语法 use databasename
ex:
use mydb
show dbs
show collections 查看集合(表)== show tables注意:只是使用use的时候并不会创建数据库,
当向数据库写入数据时数据看才会真正创建
db.movie.insert({'name':'rick'}) == var m ={'name':'rick'} db.movie.insert(m)
show dbs #有值
数据库的命名规则
1. 数据库的名字可以是满足以下条件的任意UTF-8字符串
2. 不能是“”空字符串
3. 不能含有 空格(‘ ’) 点(.) '/' '\' '\0'
4. 应全部小写
5. 不要超过64个字节
6. 不要使用admin local config这三个名字
admin : 存储用户和权限
local : 不会被复制,只能用于本地单台服务器访问config : 分片处理的时候,保存分片信息
quit() 退出mongo shell
show dbs 显示当前系统中的数据库
db 表示一个全局性变量,显示当前正在use的数据库
如果没进行任何use操作那表示test(系统自动创建)
数据库的备份和恢复
备份: mongodump -h dbhost -d dbname -o dbdir
e.g. mongodump -h 127.0.0.1 -d stu -o student
恢复
mongorestore -h <hostname>:<port> -d dbname <path>
e.g.
mongorestore -h 127.0.0.1:27017 -d student student/stu
数据库检测
mongostat退出数据库使用
insert(每秒插入次数) query(每秒查询次数) update(每秒更新次数) delete(每秒删除次数) getmore command(统计每秒运行多少命令) dirty used flushes(每秒向硬盘写入次数) vsize(使用的虚拟内存) res(使用的物理内存) qrw arw net_in net_out conn 当前连接数
mongotop
检测每个数据库的读写时长
删除数据库
db.dropDatabase()
e.g.
db.dropDatabase() 删除当前使用数据库
--------------------------------------------
集合的创建
db.createCollection(collection_name)
e.g.
创建一个叫class2的空集合
db.createCollection('class2')
展示当前数据库中的所有集合
show collections
集合就是mongo当中文档组
集合存放文档的基本原则
* 同一类文档应该集中存储,便于管理
* 集合中可以使用不同格式的文档。
* 集合中集中存储格式类似的文档,可以提高访问效率。
集合的命名规则
1.不能是空字符串
2.不能含有‘\0’
3.不能以‘system.’开头。这个是系统保留集合的前缀
4.集合名不要和保留字重名,不要包含'$'
ObjectId("5a6055574dd45d1bce06c382")
24个十六进制数 用作系统自动生成的 _id (key)
{
"_id":ObjectId("3j2k45hkjh2k3hj52"),
"name":"Lily",
"age":10
}
{
"_id":ObjectId("3j2k45hkasdf89as7"),
"name":"Lucy",
"age":11,
'sex':'m'
}
创建集合2
当向一个集合中插入一条文档,集合会被自动创建。这也是我们通常使用的一个方法
db.collection_name.insert()
e.g.
db.class3.insert({'name':'wangwu','age':15,'sex':'m'})
删除集合
db.collection_name.drop()
e.g.
db.firstclass.drop()
文档
bson格式的数据
bson 是 json的进化版本
姓名 : 张三
联系电话 : xxxx
住址 : xxxx
{‘name’:‘lili’,‘age’:13}
文档的键命名规则:
1.一般来说是utf-8格式的字符串
2.键中不能有‘\0’,不能是空字符
3. 一般不会用 . 和 $
4. 一般以_开头的都是保留的键,所以尽量不用_开头
注意事项:
* 文档的键值对是有序的
* 文档中的值,指的就是文档支持的数据类型
* Mongodb区分大小写
* 键不能有重复
mongo支持的数据类型:
字符串 utf-8格式的字符串是合法的
整型 分为 32位整型 64位整型
布尔 真 假
浮点型 存储小数
Arrays 用来存储列表或者数组
Timestamp 时间戳
Object 内部文档 {‘dic’:{}}
Null 空值
Symbol 同字符串类型,但是多用于存储特殊符号语言
Date 日期时间
ObjectId objectid子串
ObjectId("5a6055574dd45d1bce06c382")
Binary data 二进制数据
code 代码,js代码
regex 正则表达式
ObjectId("5a6055574dd45d1bce06c382")
24个十六进制数 用作系统自动生成的 _id (key)
前8位 文档创建的时间
6位 机器ID
4位 进程 id
6位 计数器