数据库
2024-05-17 09:04:37 0 举报
AI智能生成
该数据库是一个综合性的信息管理系统,涵盖了各种类型的数据,如文本、图像、音频和视频。它采用了先进的数据存储技术,如关系型数据库、NoSQL数据库和云存储,以确保数据的可靠性、安全性和可扩展性。此外,该数据库还提供了高效的数据查询和检索功能,以及数据可视化工具,以帮助用户更好地理解和分析数据。用户可以通过Web浏览器、移动应用或API接口来访问和操作数据库。
作者其他创作
大纲/内容
K·V键值对的类型(Redis、)
文档型数据库(MongoDB、ConthDB)
列存储数据库(HBS、分布式文件系统)
图关系数据库
NoSQL的四种分类
Redis,英文全称是Remote Dictionary Server(远程字典服务)
是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis是一个单线程的,他的性能瓶颈是在在于机器内存的处理速度以及网络的带宽决定的,cpu的影响并不大,单线程就行了
什么是Redis?
五种基本类型,三种特殊的类型
多样化的数据类型
在指定的时间间隔中将内存中的数据集快照写入磁盘
1.save 的条件满足时,就会自动触发
2.执行flushall后会触发
3.退出redis时也会被触发
触发生成rdb文件的机制
只需要将rdb文件放到redis的启动目录下,在启动的时候会自动检查恢复rdb中的数据
在进入redis的连接后 config get dir就能找到对应的文件夹
获取目录的方式
如何恢复rdb文件
适合大规模的数据恢复
对数据的完整性要求不高
优点
需要一定的时间间隔来触发,如果出现服务宕机的情况最后一次修改的数据会不被记录
fork进程触发的时候会占用一定的内存空间
缺点
rdb方式的优缺点
RDB操作
把所有写的操作都记录下来,恢复的时候把这个文件再执行一遍,这文件有问题的话是不能启动redis的
redis-check-aof --fix 后加aof文件可以修复aof文件
子主题
相当于数据文件来说,aof的数据文件要大于RDB
AOF运行的效率也要比rdb的速度慢
优缺点
AOF(APPEND ONLY FILE)
可以做持久化的处理
是指将一台服务器中的数据复制到其他的服务器,数据的复制是单向的,只能从主节点到从节点
主从复制的作用
主从复制查看当前库的信息 info replication
主从复制认主操作 slaveof ip 端口号
自己当主节点 slaveof no one
指令’
Reids的主从复制
文件名称: sentinel.conf
数字1表示如果主机挂了,就让从机进行投票,票数最多的上位
sentinel monitor 被监控的名称 ip port 1
启动哨兵的指令 redis-sentinel 配置文件所在的位置
原主机宕机再回来之后只能到现在的主机下做从机
配置哨兵的配置文件
哨兵模式基于主从复制,所有主从复制的优点他都有
主从可以切换,故障可以转移,系统的可用性会更好
哨兵模式就是主从模式的升级
redis不好在线扩容,集群的容量一旦达到上限,在线扩容就很麻烦
哨兵机制的配置比较繁琐
哨兵模式
集群
Redis的单条命令是有原子性的,但是事务是不能不保证原子性的
Redis中没有隔离级别的概念
开启事务的命令 multi
执行事务的命令 exec
放弃事务的命令 discard
当编译报错时,整个事务是不生效的;但是当运行时出错时只有出错的语句不执行,剩下的都执行
Redis中watch可以当做乐观锁来用
事务
支持事务
Redis的特性
当用户要查询一个数据时,缓存的机制中没有,就会向持久层的数据库中进行查询
缓存穿透的概念
布隆过滤器是一种数据结构,对所有可能查询的参数以hash的形式存储,在控制层先进行校验,不符合的话就进行丢弃
布隆过滤器
在缓存中查询不到数的话,就直接放一个空值
缓存空对象
1.空值如果能够被保存的话就需要更多的空间来存放这些东西
2.即使对空值设置了过去时间还会导致,缓存个持久存储有一段时间不一样,一致性要求比较高的就不行了
方法带来的问题
解决缓存穿透的方法
缓存击穿是指一个key值有非常高频率的访问,在这个key值失效的一个很短的时间内,访问直接访问到了持久层的数据库导致宕机
缓存击穿的概念
从缓存的角度来看只要热点的key不过期就不会有击穿的情况
设置热点的数据永不过期
对于每个key同一时间只能有一个线程可以访问持久层数据库
加互斥锁
解决缓存击穿的方法
是指在一个时间段内,很多缓存几种失效就有可能会导致
缓存雪崩的概念
搭建redis集群,一台出问题了还有其他的能补上(异地多活)
缓存失效后通过加锁或者队列的方式来控制读写数据库的线程数量
限流降级
先提前访问一下数据,把访问较高的数据放到缓存里面,跟据不同的需要设置不同的过期时间
数据预热
解决缓存雪崩的方法
Redis缓存的穿透和雪崩
订阅一个频道 subscribe 频道名称
发布者发布信息到频道 publish 频道名称 推送的内容
指令
外框
Redis的订阅发布
启动Redis : redis-severt 文件目录/配置文件
连接到Redis: redis-cli -p 6379
关闭指令: shutdown
reids有十六个数据库,select 数字可以切换数据库
清除当前数据库中的数据: flushdb
清空全部数据库中的数据: flushall
设置访问的密码: config set requirepass+密码
输入访问的密码: auth 密码
查看数据库的大小: dbsize
查看所有的key值: keys *
判断当前的key是否存在 EXISTS
移动当前的key: move key
删除当前的key: del key
查看当前key的剩余时间: ttl name
setex (set with expire): setex key 时长 value
setnx (set if not exist) 不存在了再设置(分布式锁中经常使用): setnx key value
设置过期的时间: expire name 时间
msetnx是一个原子性的操作要不同时成功,要不同时失败
同时设置多个值:mset key1 value1 k2 value2...
同时获取多个值: mget key1 key2
同时操作多个值
查看当前key值的类型: type name
追加字符串,如果有key就在后面进行拼接,如果没有就像当于set: append key value
获取字符创的长度: strlen key
自增一个指定的长度 incrby key 长度
自增一: incr key
自减一个指定的长度 decrby key 长度
自减一: decr key
先get再进行set操作(得出的value值是set之前的值) getset key value
从原来的删除插入到新的 lpoplpush 原来的key 目标key
组合命令
所有的list命令都是以l开头的,底层的结构是链表结构
将一个值或者多个值插入到列表中 lpush key values
从右边插值 rpush key values
从左开始删除一个值 lpop key
从右开始删除一个值 rpop key
通过下标来获取某个值 index key
获取值的长度 llen key
移除值 lrem key 移除的个数 value
移除值 ltrim key 开始下标 结束下标
往外取数组的元素 lrange kye 开始下标 结束下标
替换数组的元素 lset kye 下标 替换的内容
在之前/之后插入一个值 linsert key before/after 原有值 新插入的值
List类型的指令
所有set命令都是以s开头
添加值 sadd key values
看看set中的所有的元素: smember key
判断某个value是否在key中: sismember key value
获取set集合中元素的个数: scard key
移除key中的value: srem key value
从key中随机取出一个元素: srandomme key
随意移除一个value: spop key
移动value从一个key到另一个key : smove key1 key2
求两个集合的查集 : sdiff key1 key2
求两个集合的并集 : sunion key1 key2
求两个集合的交集 : sinsert key1 key2
Set类型的指令
value的值是一个map类型,其本质和String类型没太大的区别
获取值 hget KEY key
添加多个操作 hmset KEY key1 value1 key2 value2........
添加多个操作 hset KEY key1 value1 ........
添加操作
获取多个值 hmget KEY key1 key2
获取单个的值 hget KEY key
获取全部的数据 hgetall KEY
取值操作
删除数值的操作 hdel KEY key
判断个数 hlen KEY
判断是否存在 hexsit KEY
获取KEY下的所有key hkeys KEY
获取KEY下的所有value hkeys KEY
获取值后加一 hincrby KEY key 1
如果不存在的话才会进行设置 hsetnx KEY key value
Hash类型的指令
添加值的操作 zadd KEY 数值 value
移除值的操作 zrem KEY value
a获取有序集合中的个数 zcard KEY
获取集合区间值的个数 zcount KEY 最小值 最大值
添加值的操作 zrangebyscore KEY -inf +inf
Zset类型的指令
命令以geo开头,两级的数据库无法添加,一般会通过java程序导入数据
底层的原理其实就是zset
添加值的操作 geoadd KEY 纬度 经度 名称
获取经纬度的操作 geopos KEY 名称
查看两个坐标的直线距离 geodist KEY 名称1 名称2 距离单位
查询坐标为中心集合中距离半径内的名称 geodist KEY 纬度 经度 距离半径 withdist
找出位于指定元素周围的其他元素 gedradiusb KEY 名称 距离半径
geospatial地理位置
基数统计的算法,指令是以pf作为前缀的
添加值的操作 PFADD KEY values...
计数的操作 PFCOUNT KEY
取key2和key3的交集 pfmerge KEY1 key2 key3
Hyperloglog
位图存储机构,用来处理之后两种状态的数据,即用0和1进行标识
存储数据 setbit key 位数 0、1
获取数据 getbit key 位数
统计数量 bitcount key 区间
BitMaps
Redis的一些指令
Redis的一些定义
Redis
MongoDB是一个基于分布式文件存储的数据库,C++编写主要用来从处理大量的文件
MongoDB是一个介于关系型数据库和非关系型数据库之间的数据库,是非关系型数据库中功能最丰富的,最像关系型数据库的
定义
MongoDB
相同类型文档的集合、类似于数据库的表
索引(Index)
这里的文档就是指的一条一条的数据,类似于数据库中的行,保存时以JSON的形式进行保存
文档(Document)
字段就是JSON中的字段,类似于mysql中的column
字段(Filed)
是索引文档中的约束,例如字段类型的约束,类似于数据库的表结构
映射(Mapping)
JSON风格的请求语句,类似于SQL语句
DSL
基本定义
在创建文档索引时对文档的内容进行索引
在用户进行查询时对查询的内容进行分词
分词器功能
在tokenizer之前对文本进行处理,例如删除字符替换字符,处理一些特殊符号什么的
character filters
将文本按照一定的规格切分成词条(term)例如keyword,就是不进行分词
tokenizer
对tokenizer输出的词条进行进一步的处理,例如大小写转啥的
tokenizer filters
组成包含三部分
ES本身自带的分词器在进行中文分词的时候不太友好,对汉字分词时一个一个分会使得查找不准确
安装原因
这种形式分词分的比较多,能组成中文的词都会分一遍
ik_max_word
最少分词,能组成最长的词语时就不会再往下分
ik_smart
分词方式
找到ik分词器中config目录下的IKAnalyzer.cfg.xml文件在其中可以设置那些词可以分词,那些就不做分词操作
分词内容可以实现个性化的设置
IK分词
分词器
PUT /索引名称
创建
直接get /索引名称
查找
PUT /索引名称/_mapping
新增字段
delete /索引名称
删除
索引只能增删不能进行修改
修改
操作索引库的大概代码
索引
POST /索引库名/_log/id
POST请求
GET /索引库名/_log/id
GET请求
DELETE /索引库名/_log/id
DELETE请求
先删除再重新插入,如果原来就没有这个操作则只进行插入操作
语法只是将创建请求的POST请求方式转换为PUT请求方式
全量修改
直接更改其中的某个字段,语法是POST /索引库名/_update/id
部分修改
插入
全量更新跟插入的操作是一样的
全量更新
局部更新
更新
操作文档的大概代码
文档
对索引和文档的操作
查询出测试的数据,一般测试用match_all
查询所有
利用分词器对用户查找的数据进行分词,然后利用倒排索引进行查找(match、multi_match(支持多个条件))
全文检索
根据精确地词条进行查询,一般用来插keyward、Boolen、日期等类型的数据(id、range、term)
根据词条进行精确查询
term
根据值的范围进行查询
range
关键字
精确查找
distinct根据经纬度进行查询(geo_distance)
查询矩形范围内的数据
查询附近的数据
地理查询
复合查询可以将上述的各种条件组合起来(bool、function_score)
得分算法
布尔查询是一个或者多个子查询的组合
必须查询的字段,类似与
must
选择性匹配子查询类似于或
should
必须不匹配,类似非
must_not
必须匹配不参与算分
filter
如果进行排序的话,es原本的算分规则将会失效
地理字段
普通类型
语法
排序
由于es经常是以集群的方式存在的,在保存数据时具有随机性,在查询时会将每个机器上到目前的数据都取出来进行排序,再取当前要取的那部分的数据
原理
优点是支持随机分页、缺点是存在分页上限的问题,默认是10000条
场景是常遇到的互联网使用场景,可以前后分页
from+size
优点是没有查询的上限、缺点是查询的时候只能往后查,不能往前
after search
原理是将查询出的数据在内存中形成一个快照,后续的查询能在快照中取数据的就在快照中取
优点是没有查询的上限,缺点是数据不具有实时性,目前已经不推荐使用了
scroll
分页方式
分页操作
如果是混合字段时,指定某个字段设置高亮时需要更改默认值
高亮的API包括DSL的创建和对于结果的解析
高亮操作
查询语句汇总
布尔查询
复合查询
实现对文档数据的统计、分析和计算,并且参与聚合的数据必须是不能分词的
聚合名称、类型和聚合的字段
聚合的三要素
用来对文档进行分组
用途
按照文档的字段值进行分组
TermAggregation
按照日期梯度分组,例如一周为一组或者一个月为一组
Date Histogram
默认的情况下,Bucket聚合会统计Bucket中文档的数量用_count表示,并且按照顺寻从大到小排列并且,不指定query条件的情况下默认对所有的数据进行聚合
桶(Bucket)
用以计算一些值,比如最大值、最小值、平均值
AVG(平均值)、MAX(最大值)、MIN(最小值)、Stats(同时求几种值)
度量
以其它聚合的基础进行聚合
管道
聚合操作的分类
聚合操作
自动补全的接口
基本语法
常见的查询语法
DSL语法
同步调用
数据同步
将数据进行分片操作,分成N个(share),分别存储到不同的节点上
海量数据存储问题
分片分出的备份不会被放到同一个节点上
将分片的数据进行备份(replica)
单点故障问题
面临的两个问题
配置es的集群名名称一样时,es默认会分配到同一个集群
当es为集群布置时,当主节点和备用节点之间的网络通信出现异常时,备用节点默认主节点宕机,重新进行选举,选取成功后新的主节点和原来的备用节点会发生一些冲突
问题原因
为了避免脑裂问题的出现,需要要求选票的结果超出(eligile节点的数量+1)/2才能当先为主,音系eligible中的节点数量最好为单数
解决方案
es的脑裂问题
coordinating node 会把请求分发到每一个分片上
scatter phase 分散阶段
coordinating node 汇总date node的搜索结果,并处理为最终结果返回给用户
gather phase 聚合阶段
分布式查询分为两个阶段
mast节点故障之后,新的主节点会排查原来主节点上有什么分片信息,将其同步得到其他健康的节点上,用以确每个分片都有自己的备份分片信息
es集群的故障转移
参与集群选择主节点
主节点可以擦管理集群的主节点、管理分片的信息、处理创建和删除索引库的操作
master eligible 节点
对数据进行crud操作
date 节点
请求的路由和负载均衡
合并查询到的结果并返回给用户
coordinating 节点
分布式新增如何确定分片
节点类型
ES集群
ES数据库
非关系型数据库
索引是一种帮助数据查询的数据结构
索引的定义
唯一的标识,主键不能重复,只能有一个列作为主键
主键索引(PRIMARY KEY)
索引列的值必须唯一,但是允许有空值
唯一索引 (UNIQUE KEY)
默认的,index/key来表示
常规索引(index/key)
又叫做复合索引,多列索引,专门用于复合查询,效率大于多个索引的合并
联合索引
索引的分类
show index from 表名
显示表所有的索引信息
InnoDB 主键使用的是聚簇索引
如果表设置了主键,则主键就是聚簇索引
如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索引
以上都没有,则会默认创建一个隐藏的row_id作为聚簇索引
聚簇索引就是按照每张表的主键构造一颗B+树,每张表只能有一个聚簇索引
普通索引也叫二级索引,除聚簇索引外的索引,即非聚簇索引。
聚集索引和非聚集索引的区别
范式一:每一列都是不可再生的
范式二:在范式一的基础上,非主键内容完全依赖于主键
范式三:在范式二的基础上,非主键的内容只依赖于主键,不依赖于其他键
数据库的范式
原子性:每一个都是不可分割的
持久性:数据被修改后就会永久保存
一致性:无论数据怎样进行变化,数据的总量是不变的
隔离性:数据发生变化不会影响其他的数据
数据库的特性
脏读:一个事务读取到了其他事务未提交的内容
不可重复读:同一个事务在执行过程中多次查询的返回结果不同,与脏读的区别主要在于此执行过程还没结束
幻读:在操作同一批数据做修改,修改完成并提交后,此事务又读到其事务又提交的复核修改前的数据。和不可重复读的主要区别在于幻读侧重的是对一批数据的处理,不可重复读是对具体数据的处理
事务并发访问可能会引起的问题
未提交读(Read UnCommit):读取到未进行提交的内容,可能会导致脏读
已提交读(Read Commit):大多的数据库默认的隔离级别,一个事务在提交前所做的所有的操作都是不会被看到的,可能会导致不可重读的情况发生、
可重复读(Repeable Read):数据库默认的隔离级别,同一事务的多个实例在并发读取事务时会看到同样的数据行
串行化(Serializable) 最高的隔离级别,强制事务的执行顺序进行排序执行,使之不可能会发生冲突
隔离级别
基于数据版本对于并发事务进行访问
每一次更新的事务的id
事务id
TRX_ID
指针信息:指向了上一个版本的数据信息
DOB_ROLL_PRT
无论事务是否已经已经提交都会被记录到版本链中,且undolog用完之后不会立即被删除,mysql在确定这个控制连不会被使用时才会进行删除
概念模型图
基于undoLog(回滚日志的控制连)
快照读
指在修改数据之前进行查询的操作(INSERT\\UPDATE\\读写锁啥的)
当前读
这里延申两个定义
当前活跃的事务编号集合
m_ids
最小活跃编号
min_trx_id
预分配的事务编号,当前最大的事务+1
max_trx_id
当前readView创建者的事务编号
creator_trx_id
是一种数据结构、包含四个字段
在RC的隔离级别下,每一次进行快照读都会生成一个新的ReadView
连续多次进行快照读的情况下,ReadView会被多次进行复用,避免了幻读的情况
也会有例外(两次快照读的中间存在当前读的情况下就会重新生成ReadView)
在RR的隔离级别下,仅在第一次进行快照读会生ReadView,后面再使用这个快照读都会使用这个
不同隔离级别生成
判断规则
ReadView
MVCC多版本并发控制
视图是一个虚表,由查询的语句定义出来的,可以当做表来使用
视图中的数据没有实际的物理存储
可更新视图:在定义的时候需要添加 WITH CHECK OPTION,这样的话就可以用视图实现对基本表的更新操作
视图的概念
视图
INNODB
MYISAM
支持
不支持
事务支持
支持
数据行锁定
不支持
外键约束
不支持
支持
全文索引
较大,约为两倍
较小
表空间的大小
InooDB在数据库表中只有一个*.frm文件,以及上级目录下的ibdata1文件
*.frm表结构的定义文件
*.MYD数据文件
*.MYI索引的文件
MYISAM对应文件
两者物理文件上面的区别
数据表的类型
建表时的的语句
alter table 表名 ADD CONSTRAINT `约束名` FOREIGN KEY ( `作为外键的列` ) REFERENCES `哪个表` ( `哪个字段` )
修改表时添加外键
以上的操作都是物理外键,因为删除表的时候会很麻烦想,要找到依赖,一般的不进行使用
添加外键的语句
外键
int后面的括号只是表示显示多少
int 标准的整数 4个字节
bigint 较大的数据 8个字节
float 浮点型 4个字节
double 浮点型 8个字节
decimal 字符串类型的浮点数 金融计算的时候一般使用这个
数值类型
char 固定大小的字符串 0-255
varchar 可变的字符串 0-65535长度
tinytext 微型的文本 2^8-1
text 文本串 2^16-1
字符串类型
date YYYY-MM-DD
time hh:mm:ss
datetime YY-MM-DD hh:mm:ss
timestamp 为时间戳,1970.1.1到现在的毫秒数
时间类型
数据库列的类型
show databases
显示所有的数据库
show tables
查看数据库中所有的表
describe 表名
查看某张表
alter table 表名 rename as 新表名
修改表的名称
alter table 表名 add 列名 类型 after 那一列
添加表的字段到指定的列
alter table 表名 modify 列名 约束类型
修改字段的类型
alter table 表名 原字段名 先字段名 约束类型
修改字段的名称
alter table 表名 drop 字段名称
删除表中的字段
修改表中的字段
拼接字符的函数
count(列名) 会忽略null的
count(*) 不会忽略null值的 本质是计算行数
count(1) 不会忽略null值的 本质是计算行数 但是这个是把所有的值都当做一,速度比count(*)更快
计数用的count
聚合函数
操作库的指令
基础知识
专有窗口函数
avg\\
聚合窗口函数
普通环境下聚合函数是将多条数据变为一条,但是窗口函数的情况下原来是多少条数据后续还是会是多少条数据
分组:
窗口函数和普通情况下聚合函数的区别
窗口函数
使用情况:当库中的数据超过千万级就不建议使用单库了
及主从复制的情况,一个住负责写,利用数据库同步写的情况写入到从服务器中
配合MHA中间件(主服务器挂掉可以选举)实现高可用性
适用于读多写少的互联网应用
架构复杂度提升,成本提高
读写分离的模式
架构的复杂性提上了,成本提高
每个节点数据只是所有数据的一个子集
适用于十亿级数据总量大型应用
不具备高可用性质
及分库分表的集群模式
及根据范围进行分割
优点,机构见到那、扩展时比较容易,适合范围i的搜索
缺点:数据分布不均匀,局部的负载压力大,适用于 流水账类型的应用
范围法
也分为取模(最简单的类型来说就是对于id进行取余)与一致性Hash
优点:数据分配均衡
缺点:提前部署对应足够的节点,适用于预算比较充足的大型互联网应用
Hash法
分片的算法
及分库分表形式的分表,表所有的数据结构都是相同的,解决数据量大的一个存储问题
水平分表
将一张大表按“列”拆分为两张以上的小表,通过外键关联来获取数据
InoDB的存储方式 行--->页(page一页大概可以存储16k的数据)-->区(Extent基本时1MB的存储空间即64个页)在1.0后引入了压缩页的概念:及通过压缩使一页中可以存储更过的数据,跨页需要解压,解压的效率比较低
垂直分表
分表方式
分片的集群模式
使用的中间件MyCat或者ShardingSphere
集群的模式
集群设置
mysql
关系型数据库
数据库
0 条评论
回复 删除
下一页