我们为什么要学习数据库
了解数据库,我们首先需要区分一下数据库和数据仓库
数据库是一种逻辑概念,用来存储数据的仓库,侧重存储
数据仓库:从数据量来说,数据仓库要比数据库庞大的多,主要用于数据挖掘和数据分析。
在这里我们可以类比git和github,git是一个版本管理工具,而github是一个在线的仓库,你的所有代码都可以提交到这个网上仓库中,在学数据库的同时,我们其实已经学习到两个知识点。
那么,其实我们发现有很多数据库需要我们学习,为什么要学习这么多数据库,学习一种不行吗?
我们学习这些数据库,就是要将这些数据库组合起来使用,是为了提高检索速度,减少用户等待时间。
因为用户的很多信息都需要数据库来进行存储,而mysql一般是存储在硬盘上,用物理磁盘读写数据,速度相对来说比较慢,如果要提高用户的访问体验,比如最近用户的登陆信息我就存放在redis或者mongodb中,这样用户登录的话就不用等待太长时间。
用户登录账号以后,就会请求相关的信息,那么最有可能先去非关系型数据库mongodb或者redis中去查找,如果没找到,就会去持久的关系型数据库当中去查找,没有查到,那是因为信息没有录入,如果查到了相关的数据,我们就把当前查到的数据存储到redis里面去,经过客户端,再返回给用户,因为这时候我们也要考虑,别的用户是不是也要访问相关的数据信息,redis里面存储的就是经常使用的数据信息。
举个例子,大家都在12306上买过票吧,春运期间几千万的点击量,如果都要从关系型数据库mysql当中获取用户信息,服务器的压力就会超大,那么作为IT攻城狮来说,你今天没买上票,不要灰心,你的登录信息已经存在我的redis数据库当中啦,我知道你最近需要买票,下次登录就会快速进入购票页面啦,而且为了应对春运期间服务器的压力,一些固定页面的内容都直接放在redis数据库当中,比如12306网站的首页。
redis和mongodb的区别
而redis和mongodb之间的区别主要在mongodb能实现海量数据的访问效率提升,同时内置一些数据分析功能(mapreduce),redis更偏向于较小数据量的性能和运算,按照进程顺序写入,虽然支持集群,也仅限于主-从模式。
这里的主从模式我们可以这样理解,我们在实际处理数据的时候,为了降低每个redis服务器的负载,我们可以设置多个服务器一起执行任务,做主从模式,也就是一个redis服务器负责写数据,其他的服务器负责读数据,主服务器的数据也会自动的同步给其他的从服务器。
三大数据库大比拼
mysql:
安装服务端:
sudo apt-get install mysql-server
安装客户端:
sudo apt-get install mysql-client
进入服务器的命令操作
sudo /etc/init.d/mysql start 密码:tarena
进入客户端
mysql –u root –p密码
退出命令:
quit /q exit
如果命令写错用/c清理错误,而不至于退出mysql数据库
在MySQL当中,sql语句的书写不区分大小写,但是文件的名字要区分大小写,这里的命令都是以;结尾
我们知道mysql是关系型数据库,那什么是关系呢,任何事物之间的联系都叫做关系,数据库当中表与表之间的联系就是关系,也是一种数据,需要存储下来。
在数据库的查询过程中,我们会用到索引,那么什么是索引呢,索引的本质就是数据结构,是帮助MySQL高效获取数据的数据结构。
在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,这里我们讨论两个存储引擎,MyISAM和InnoDB,这两者的引擎使用的都是B+Tree作为索引结构,B+树的定义十分复杂,因此只简要地介绍B+树:B+树是为磁盘或其他直接存取辅助设备而设计的一种平衡查找树,在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶节点中,各叶节点指针进行连接。
关于MySQL索引的数据结构和算法原理可以参照如下链接
总结一下mysql数据库中的一些简单操作:
创建数据库:create database test charset=utf8;使用数据库:use test那这时候可以在里面进行增删改查
增:
create table 表名
insert into 表名 (column1, column2, column3,...columnN) values (value1, value2, value3,...valueN);
insert into 表名 values (value1, value2, value3,...valueN);
删:
drop table 表名 整个删除
delete table 表名 还会留下表头,但表中的内容已经被删除了
改
update table set xx=xx,xxx=xx where xxx=xxx and xxx=xxx;
这里的修改可以在后面限定一些条件,我们也可以根据update的中文翻译来确定它的作用,修改,更新的意思。
查
show tables 查看有多少表
select * from 表名
select column1,column2,...columnN from 表名 where 条件1 and 条件2...and 条件N;
其实数据库的使用最常用最重要的也是查询,当然查询的话需要各种各样的条件限定,这就需要大家针对查询这一块做一个文档总结,这完全有必要,因为这一块的信息量太大了,在此不再赘述。
MongoDB:
文档型数据库,数据结构由键值对组成,适用于事件的记录,内容管理或博客平台,通过第三方平台访问和抓取数据
它的性能比较好,是因为它是C++语言编写,运行稳定,可以将不同数据结构的文档存储在同一个数据库里,尤其适合存储json文件的格式,所以一般爬虫的时候会用到。
json的数据格式在python当中叫做字典,在JavaScript中叫做Json
mongodb支持分布式,建一个集群,可以建立在多台电脑上,共同使用mongodb虽然支持内存级别的读写,也支持物理存储
因为这里面都是键值对的存储方式,所以在开始查询的时候会用到大括号,即使没有任何的条件,这里的大括号也一定要用上。
在mongodb官网上下载,安装以后既包含客户端又包含服务器端,服务端是mongod,客户端是mongo。
一般的情况下让mongodb服务器在后台启动,不会占用一个终端,只需要在终端输入:sudo service mongod restart
安装服务端:
sudo apt-get install mongodb
设置数据库端口
mongod --port 8080如果不设置默认 27017
启动服务端:
在终端输入:mongod
启动客户端:
在终端输入:mongo
退出命令:
quit /q exit
mongodb中的一些操作命令
这里的数据库语句区分大小写
展示所有数据库名字
show dbs
创建数据库
use 数据库名字
当前使用的数据库我们可以用db表示
显示当前数据库的集合
show collections
删除数据库
use mydb 这个数据库删除之前还需要选择db.dropDatabase()show dbs
创建集合
db.createCollection(集合名)
删除集合
db.集合名.drop()
删除文档
remove({})将文档从集合中永久删除
注意:
如果没有任何参数,将会把集合内的所有文档全部删除,这种情况默认状态是删除所有文档,所以必须注意
插入文档
db.集合名.insert(
同时插入多个文档,可以传递给insert()一个数列:
db.集合名.insert([,{文档2},... {文档n}])
文档里面都是键值对,中间以逗号隔开
查询文档
db.集合名.find()
用pretty()格式化的展示结果
db.集合名.find().pretty()
findOne()查询集合中的一条文档
db.集合名.findOne(),用了这条语句以后再不用加pretty()
Redis:
redis官网下载安装包
解压
tar zxvf redis-3.2.5.tar.gz
复制:推荐放到usr/local目录下
sudo mv -r redis-3.2.3/* /usr/local/redis/
进入redis目录
cd /usr/local/redis/
生成
sudo make
测试
sudo make test这段运行时间会较长
安装:将redis的命令安装到/usr/bin/目录
sudo make install
运行启动服务器:在桌面目录
redis-server按ctrl+c停止
启动客户端:在新终端中运行如下代码
redis-cli
运行命令
pingset 'a' '123'
当添加键值后,发现在当前运行的目录下,创建了一个文件:dump.rdb,这个文件用于将数据持久化存储
string
string是redis最基本的类型
最大能存储512MB数据
string类型是二进制安全的,即可以为任何数据,比如数字、图片、序列化对象等
设置键值
set key value
设置键值及过期时间,以秒为单位
SETEX key seconds value
设置多个键值
MSET key value [key value ...]
根据键获取值,如果不存在此键则返回nil
GET key
根据多个键获取多个值
MGET key [key ...]
追加值
APPEND key value
获取值长度
STRLEN key
redis数据库中键的操作类似于python当中字典的操作,我们可以简单的来看一下
查找键,参数支持正则
KEYS pattern
判断键是否存在,如果存在返回1,不存在返回0
EXISTS key [key ...]
查看键对应的value的类型
TYPE key
删除键及对应的值
DEL key [key ...]
hash
hash用于存储对象,对象的格式为键值对
列表
列表的元素类型为string按照插入顺序排序在列表的头部或者尾部添加元素
集合无序集合
元素为string类型元素具有唯一性,不重复
有序集合
元素为string类型元素具有唯一性,不重复每个元素都会关联一个double类型的score,表示权重,通过权重将元素从小到大排序,元素的score可以相同
启动redis的一些建议:
1 加上 号使redis以后台程序方式运行./redis-server &
2 启动时指定配置文件
redis-server ./redis.conf
3 使用Redis启动脚本设置开机自启动
推荐在生产环境中使用启动脚本方式启动redis服务。启动脚本redisinitscript 位于位于Redis的 /utils/ 目录下。
领取专属 10元无门槛券
私享最新 技术干货