数据库
2024-08-07 19:49:09 10 举报
AI智能生成
该数据库是一个综合性的信息管理系统,涵盖了各种类型的数据,如文本、图像、音频和视频。它采用了先进的数据存储技术,如关系型数据库、NoSQL数据库和云存储,以确保数据的可靠性、安全性和可扩展性。此外,该数据库还提供了高效的数据查询和检索功能,以及数据可视化工具,以帮助用户更好地理解和分析数据。用户可以通过Web浏览器、移动应用或API接口来访问和操作数据库。
作者其他创作
大纲/内容
非关系型数据库
NoSQL的四种分类
K·V键值对的类型(Redis、)
文档型数据库(MongoDB、ConthDB)
列存储数据库(HBS、分布式文件系统)
图关系数据库
Redis
Redis的一些定义
什么是Redis?
Redis,英文全称是Remote Dictionary Server(远程字典服务)
是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis是一个单线程的,他的性能瓶颈是在在于机器内存的处理速度以及网络的带宽决定的,cpu的影响并不大,单线程就行了
Redis的特性
多样化的数据类型
五种基本类型,三种特殊的类型
可以做持久化的处理
RDB操作
在指定的时间间隔中将内存中的数据集快照写入磁盘
触发生成rdb文件的机制
1.save 的条件满足时,就会自动触发
2.执行flushall后会触发
3.退出redis时也会被触发
如何恢复rdb文件
只需要将rdb文件放到redis的启动目录下,在启动的时候会自动检查恢复rdb中的数据
获取目录的方式
在进入redis的连接后 config get dir就能找到对应的文件夹
rdb方式的优缺点
优点
适合大规模的数据恢复
对数据的完整性要求不高
缺点
需要一定的时间间隔来触发,如果出现服务宕机的情况最后一次修改的数据会不被记录
fork进程触发的时候会占用一定的内存空间
AOF(APPEND ONLY FILE)
把所有写的操作都记录下来,恢复的时候把这个文件再执行一遍,这文件有问题的话是不能启动redis的
redis-check-aof --fix 后加aof文件可以修复aof文件
优缺点
优点
数据完整
缺点
相当于数据文件来说,aof的数据文件要大于RDB
因为AOF存储所有的指令文件大且考虑到IO性能
的问题运行的效率也要比rdb的速度慢
的问题运行的效率也要比rdb的速度慢
为了解决这个问题将AOF文件中相同的指令压缩,只保留一个最新的数据操作指令
恢复的步骤
过程
首先根据库中的数据重新创建一个AOF的文件
读取当前redis中的数据写入新的AOF文件
重写完成后用新的AOF文件替换掉旧的
按照上述的过程时,需要读取所有的数据时会比较消耗性能所以单独开了一个子进程来处理,
如果在此过程中数据发生变化需要将数据刷新到重写缓冲区中以此来防止出现数据不一致问题
如果在此过程中数据发生变化需要将数据刷新到重写缓冲区中以此来防止出现数据不一致问题
集群
Reids的主从复制
是指将一台服务器中的数据复制到其他的服务器,数据的复制是单向的,只能从主节点到从节点
指令’
主从复制查看当前库的信息 info replication
主从复制认主操作 slaveof ip 端口号
自己当主节点 slaveof no one
两种复制方式
全量复制
从节点向主节点发送一个同步(SYCN)请求,主节点会形成一个数据快照,将数据快照发送给从节点,从节点删除原来数据,将快照内的信息写入
发生在初始化阶段
增量复制
通过维护off set这样一个复制偏移量,来让主从节点完成复制的
发生在主节点的数据发生变更时
哨兵模式
配置哨兵的配置文件
文件名称: sentinel.conf
sentinel monitor 被监控的名称 ip port 1
数字1表示如果主机挂了,就让从机进行投票,票数最多的上位
启动哨兵的指令 redis-sentinel 配置文件所在的位置
原主机宕机再回来之后只能到现在的主机下做从机
优缺点
优点
哨兵模式基于主从复制,所有主从复制的优点他都有
主从可以切换,故障可以转移,系统的可用性会更好
哨兵模式就是主从模式的升级
缺点
redis不好在线扩容,集群的容量一旦达到上限,在线扩容就很麻烦
哨兵机制的配置比较繁琐
支持事务
事务
Redis的单条命令是有原子性的,但是事务是不能不保证原子性的
Redis中没有隔离级别的概念
开启事务的命令 multi
执行事务的命令 exec
放弃事务的命令 discard
当编译报错时,整个事务是不生效的;但是当运行时出错时只有出错的语句不执行,剩下的都执行
Redis中watch可以当做乐观锁来用
Redis有线程安全的问题吗
redis本身是一个线程安全的k-v形式的数据库,不需要任何的同步机制,所以他不存在任何线程安全的问题
rides6.0中增加的线程安全的模型只是用于处理网络的IO事件,还是只使用主线程来处理指令
rides6.0中增加的线程安全的模型只是用于处理网络的IO事件,还是只使用主线程来处理指令
为什么redis没有使用多个线程来执行指令
redis出现性能的瓶颈是网络、io、cpu、内存,但是CPU不是主要的点,所以没必要用多线程
如果使用多线程来执行命令还得考虑到加锁的问题,需要付出的代价更高
内存的淘汰策略
Random算法
TTL算法
在设置了过期时间的key中找到更早过期时间的进行有限deed移除
LRU算法
去移除最近很少使用的key
Redis中一种比较常见的内存淘汰算法、在内存中会维护一个大小为16的候选池,按照时间进行排序,每次从其中随机选五个值进行淘汰
LFU算法
redis分布式
分布式锁
是一种跨进程跨机器的互斥锁,
SETNX命令
当key不存在时就返回1存在时就返回0
EXPIR
设置锁的失效时间,避免锁的死锁
遇到的问题
如果程序还没执行完但是失效时间到了怎么办
Redisson中有一个watch dog的机制可以帮助对于key值进行续期
集群模式下遇到主从切换导致锁失效的问题
RedLock
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
设置过期的时间: expire name 时间
查看当前key的剩余时间: ttl name
setex (set with expire): setex key 时长 value
setnx (set if not exist) 不存在了再设置(分布式锁中经常使用): setnx key value
同时操作多个值
同时设置多个值:mset key1 value1 k2 value2...
msetnx是一个原子性的操作要不同时成功,要不同时失败
同时获取多个值: mget key1 key2
查看当前key值的类型: type name
追加字符串,如果有key就在后面进行拼接,如果没有就像当于set: append key value
获取字符创的长度: strlen key
自增一: incr key
自增一个指定的长度 incrby key 长度
自减一: decr key
自减一个指定的长度 decrby key 长度
组合命令
先get再进行set操作(得出的value值是set之前的值) getset key value
从原来的删除插入到新的 lpoplpush 原来的key 目标key
List类型的指令
所有的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 原有值 新插入的值
Set类型的指令
所有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
Hash类型的指令
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
Zset类型的指令
所有的命令都是以z开头的,其实就是有序的set
添加值的操作 zadd KEY 数值 value
移除值的操作 zrem KEY value
a获取有序集合中的个数 zcard KEY
获取集合区间值的个数 zcount KEY 最小值 最大值
添加值的操作 zrangebyscore KEY -inf +inf
geospatial地理位置
命令以geo开头,两级的数据库无法添加,一般会通过java程序导入数据
底层的原理其实就是zset
添加值的操作 geoadd KEY 纬度 经度 名称
获取经纬度的操作 geopos KEY 名称
查看两个坐标的直线距离 geodist KEY 名称1 名称2 距离单位
查询坐标为中心集合中距离半径内的名称 geodist KEY 纬度 经度 距离半径 withdist
找出位于指定元素周围的其他元素 gedradiusb KEY 名称 距离半径
Hyperloglog
基数统计的算法,指令是以pf作为前缀的
添加值的操作 PFADD KEY values...
计数的操作 PFCOUNT KEY
取key2和key3的交集 pfmerge KEY1 key2 key3
BitMaps
位图存储机构,用来处理之后两种状态的数据,即用0和1进行标识
存储数据 setbit key 位数 0、1
获取数据 getbit key 位数
统计数量 bitcount key 区间
MongoDB
子主题
定义
MongoDB是一个基于分布式文件存储的数据库,C++编写主要用来从处理大量的文件
MongoDB是一个介于关系型数据库和非关系型数据库之间的数据库,是非关系型数据库中功能最丰富的,最像关系型数据库的
子主题
ES数据库
基本定义
索引(Index)
相同类型文档的集合、类似于数据库的表
文档(Document)
这里的文档就是指的一条一条的数据,类似于数据库中的行,保存时以JSON的形式进行保存
字段(Filed)
字段就是JSON中的字段,类似于mysql中的column
映射(Mapping)
是索引文档中的约束,例如字段类型的约束,类似于数据库的表结构
DSL
JSON风格的请求语句,类似于SQL语句
分词器
分词器功能
在创建文档索引时对文档的内容进行索引
在用户进行查询时对查询的内容进行分词
组成包含三部分
character filters
在tokenizer之前对文本进行处理,例如删除字符替换字符,处理一些特殊符号什么的
tokenizer
将文本按照一定的规格切分成词条(term)例如keyword,就是不进行分词
tokenizer filters
对tokenizer输出的词条进行进一步的处理,例如大小写转啥的
IK分词
安装原因
ES本身自带的分词器在进行中文分词的时候不太友好,对汉字分词时一个一个分会使得查找不准确
分词方式
ik_max_word
这种形式分词分的比较多,能组成中文的词都会分一遍
ik_smart
最少分词,能组成最长的词语时就不会再往下分
分词内容可以实现个性化的设置
找到ik分词器中config目录下的IKAnalyzer.cfg.xml文件在其中可以设置那些词可以分词,那些就不做分词操作
对索引和文档的操作
索引
创建
PUT /索引名称
查找
直接get /索引名称
新增字段
PUT /索引名称/_mapping
删除
delete /索引名称
修改
索引只能增删不能进行修改
操作索引库的大概代码
文档
创建
POST请求
POST /索引库名/_log/id
查找
GET请求
GET /索引库名/_log/id
删除
DELETE请求
DELETE /索引库名/_log/id
修改
全量修改
先删除再重新插入,如果原来就没有这个操作则只进行插入操作
语法只是将创建请求的POST请求方式转换为PUT请求方式
部分修改
直接更改其中的某个字段,语法是POST /索引库名/_update/id
操作文档的大概代码
插入
查找
更新
全量更新
全量更新跟插入的操作是一样的
局部更新
DSL语法
常见的查询语法
查询所有
查询出测试的数据,一般测试用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经常是以集群的方式存在的,在保存数据时具有随机性,在查询
时会将每个机器上到目前的数据都取出来进行排序,再取当前要取的那部分的数据
时会将每个机器上到目前的数据都取出来进行排序,再取当前要取的那部分的数据
分页方式
from+size
优点是支持随机分页、缺点是存在分页上限的问题,默认是10000条
场景是常遇到的互联网使用场景,可以前后分页
after search
优点是没有查询的上限、缺点是查询的时候只能往后查,不能往前
scroll
原理是将查询出的数据在内存中形成一个快照,后续的查询能在快照中取数据的就在快照中取
优点是没有查询的上限,缺点是数据不具有实时性,目前已经不推荐使用了
高亮操作
如果是混合字段时,指定某个字段设置高亮时需要更改默认值
高亮的API包括DSL的创建和对于结果的解析
查询语句汇总
聚合操作
实现对文档数据的统计、分析和计算,并且参与聚合的数据必须是不能分词的
聚合的三要素
聚合名称、类型和聚合的字段
聚合操作的分类
桶(Bucket)
用途
用来对文档进行分组
TermAggregation
按照文档的字段值进行分组
Date Histogram
按照日期梯度分组,例如一周为一组或者一个月为一组
默认的情况下,Bucket聚合会统计Bucket中文档的数量用_count表示,并且按照顺寻从大到小排列
并且,不指定query条件的情况下默认对所有的数据进行聚合
并且,不指定query条件的情况下默认对所有的数据进行聚合
度量
用以计算一些值,比如最大值、最小值、平均值
AVG(平均值)、MAX(最大值)、MIN(最小值)、Stats(同时求几种值)
管道
以其它聚合的基础进行聚合
自动补全的接口
基本语法
数据同步
同步调用
ES集群
面临的两个问题
海量数据存储问题
将数据进行分片操作,分成N个(share),分别存储到不同的节点上
单点故障问题
将分片的数据进行备份(replica)
分片分出的备份不会被放到同一个节点上
配置es的集群名名称一样时,es默认会分配到同一个集群
es的脑裂问题
问题原因
当es为集群布置时,当主节点和备用节点之间的网络通信出现异常时,备用节点默认主节点宕机,重新进行选举,选取成功后新的主节点和原来的备用节点会发生一些冲突
解决方案
为了避免脑裂问题的出现,需要要求选票的结果超出(eligile节点的数量+1)/2才能当先为主,音系eligible中的节点数量最好为单数
分布式查询分为两个阶段
scatter phase 分散阶段
coordinating node 会把请求分发到每一个分片上
gather phase 聚合阶段
coordinating node 汇总date node的搜索结果,并处理为最终结果返回给用户
es集群的故障转移
mast节点故障之后,新的主节点会排查原来主节点上有什么分片信息,将其同步得到其他健康的节点上,用以确每个分片都有自己的备份分片信息
节点类型
master eligible 节点
参与集群选择主节点
主节点可以擦管理集群的主节点、管理分片的信息、处理创建和删除索引库的操作
date 节点
对数据进行crud操作
分布式新增如何确定分片
coordinating 节点
请求的路由和负载均衡
合并查询到的结果并返回给用户
子主题
子主题
关系型数据库
mysql
存储引擎
InnoDB
MySQL 默认的事务型存储引擎,只有在需要它不支持的特性时,才考虑使用其它存储引擎
子主题
MyISAM
两者的对比
InnoDB
MyISAM
支持事务
不支持事务
行级锁和表级锁都支持
只支持表级锁(适合查询)
数据和索引存储一个文件
数据和索引分开存储
支持外检
不支持外键
索引
索引的定义
索引是一种帮助数据查询的数据结构
索引的分类
主键索引(PRIMARY KEY)
唯一的标识,主键不能重复,只能有一个列作为主键
唯一索引 (UNIQUE KEY)
索引列的值必须唯一,但是允许有空值
常规索引(index/key)
默认的,index/key来表示
联合索引
又叫做复合索引,多列索引,专门用于复合查询,效率大于多个索引的合并
显示表所有的索引信息
show index from 表名
聚集索引和非聚集索引的区别
聚簇索引就是按照每张表的主键构造一颗B+树,每张表只能有一个聚簇索引
InnoDB 主键使用的是聚簇索引
如果表设置了主键,则主键就是聚簇索引
如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索引
以上都没有,则会默认创建一个隐藏的row_id作为聚簇索引
普通索引也叫二级索引,除聚簇索引外的索引,即非聚簇索引。
索引那些情况下会失效
查询的字段中如果包含or就可能会导致索引失效
查询的字段中使用like语句是%如果在左边也可能会导致失效
联合索引时没有遵守最左匹配原则时
最左匹配原则
由于联合索引由多个索引字段构成在进行结构创建时遵循先以最左边的索引做为树状图上面部分
自身的优化器认为全表扫描比使用索引快时
对字段进行判空处理、运算处理、判断大小处理、作为连接的字段编码不一致时
数据库的范式
范式一:每一列都是不可再生的
范式二:在范式一的基础上,非主键内容完全依赖于主键
范式三:在范式二的基础上,非主键的内容只依赖于主键,不依赖于其他键
事务
数据库的特性
原子性:每一个都是不可分割的
持久性:数据被修改后就会永久保存
一致性:无论数据怎样进行变化,数据的总量是不变的
隔离性:数据发生变化不会影响其他的数据
事务并发访问可能会引起的问题
脏读:一个事务读取到了其他事务未提交的内容
不可重复读:同一个事务在执行过程中多次查询的返回结果不同,与脏读的区别主要在于此执行过程还没结束
幻读:在操作同一批数据做修改,修改完成并提交后,此事务又读到其事务又提交的复核修改前的数据。和不可重复读的主要区别在于幻读侧重的是对一批数据的处理,不可重复读是对具体数据的处理
隔离级别
未提交读(Read UnCommit):读取到未进行提交的内容,可能会导致脏读
已提交读(Read Commit):大多的数据库默认的隔离级别,一个事务在提交前所做的所有的操作都是不会被看到的,可能会导致不可重读的情况发生、
可重复读(Repeable Read):数据库默认的隔离级别,同一事务的多个实例在并发读取事务时会看到同样的数据行
串行化(Serializable) 最高的隔离级别,强制事务的执行顺序进行排序执行,使之不可能会发生冲突
事务的实现方式
编程式事务
需要自己写代码在什么地方开启 提交事务
声明式事务
使用@Transactional声明
参数
子主题
事务的传播方式
支持当前事务的
Propagation.REQUIRED
默认的事务传播级别,它表示如果当前存在事务,则加⼊该事务;如果当前没有事务,则创建⼀个新的事务。
Propagation.SUPPORTS
如果当前存在事务,则加⼊该事务;如果当前没有事务,则以⾮事务的⽅式继续运⾏。
Propagation.MANDATORY
如果当前存在事务,则加⼊该事务;如果当前没有事务,则抛出异常。
不支持当前事务的
Propagation.REQUIRES_NEW
表示创建⼀个新的事务,如果当前存在事务,则把当前事务挂起。也就是说不管外部⽅法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部⽅法会新开启⾃⼰的事务,且开启的事务相互独⽴,互不⼲扰。
Propagation.NOT_SUPPORTED
以⾮事务⽅式运⾏,如果当前存在事务,则把当前事务挂起
Propagation.NEVER:
以⾮事务⽅式运⾏,如果当前存在事务,则抛出异常
嵌套事务的
Propagation.NESTED
如果当前存在事务,则创建⼀个事务作为当前事务的嵌套事务来运⾏;如果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED。
MVCC多版本并发控制
基于数据版本对于并发事务进行访问
基于undoLog(回滚日志的控制连)
TRX_ID
事务id
每一次更新的事务的id
DOB_ROLL_PRT
指针信息:指向了上一个版本的数据信息
无论事务是否已经已经提交都会被记录到版本链中,且undolog用完之后不会立即被删除,mysql在确定这个控制连不会被使用时才会进行删除
概念模型图
ReadView
这里延申两个定义
快照读
这个就是指最普通的select查询语句,MVCC就是在快照读的时候用的
当前读
指在修改数据之前进行查询的操作(INSERT\UPDATE\读写锁啥的)
是一种数据结构、包含四个字段
m_ids
当前活跃的事务编号集合
min_trx_id
最小活跃编号
max_trx_id
预分配的事务编号,当前最大的事务+1
creator_trx_id
当前readView创建者的事务编号
不同隔离级别生成
在RC的隔离级别下,每一次进行快照读都会生成一个新的ReadView
在RR的隔离级别下,仅在第一次进行快照读会生ReadView,后面再使用这个快照读都会使用这个
连续多次进行快照读的情况下,ReadView会被多次进行复用,避免了幻读的情况
也会有例外(两次快照读的中间存在当前读的情况下就会重新生成ReadView)
判断规则
视图
视图的概念
视图是一个虚表,由查询的语句定义出来的,可以当做表来使用
视图中的数据没有实际的物理存储
可更新视图:在定义的时候需要添加 WITH CHECK OPTION,这样的话就可以用视图实现对基本表的更新操作
基础知识
数据表的类型
MYISAM
INNODB
事务支持
不支持
支持
数据行锁定
不支持
支持
外键约束
不支持
支持
全文索引
支持
不支持
表空间的大小
较小
较大,约为两倍
两者物理文件上面的区别
InooDB在数据库表中只有一个*.frm文件,以及上级目录下的ibdata1文件
MYISAM对应文件
*.frm表结构的定义文件
*.MYD数据文件
*.MYI索引的文件
外键
添加外键的语句
建表时的的语句
KEY `FK_teacherid` ( `teacher_id` ),
CONSTRAINT `FK_teacherid` FOREIGN KEY ( `teacher_id` ) REFERENCES `teacher` ( `teacherid` )
CONSTRAINT `FK_teacherid` FOREIGN KEY ( `teacher_id` ) REFERENCES `teacher` ( `teacherid` )
修改表时添加外键
alter table 表名 ADD CONSTRAINT `约束名` FOREIGN KEY ( `作为外键的列` ) REFERENCES `哪个表` ( `哪个字段` )
以上的操作都是物理外键,因为删除表的时候会很麻烦想,要找到依赖,一般的不进行使用
数据库列的类型
数值类型
int 标准的整数 4个字节
int后面的括号只是表示显示多少
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 字段名称
聚合函数
拼接字符的函数
SELECT CONCAT('学号:',emp_no) '学号' FROM salaries
计数用的count
count(列名) 会忽略null的
count(*) 不会忽略null值的 本质是计算行数
count(1) 不会忽略null值的 本质是计算行数 但是这个是把所有的值都当做一,速度比count(*)更快
窗口函数
专有窗口函数
聚合窗口函数
avg\
窗口函数和普通情况下聚合函数的区别
普通环境下聚合函数是将多条数据变为一条,但是窗口函数的情况下原来是多少条数据后续还是会是多少条数据
分组:
集群设置
使用情况:当库中的数据超过千万级就不建议使用单库了
集群的模式
读写分离的模式
及主从复制的情况,一个住负责写,利用数据库同步写的情况写入到从服务器中
优缺点
配合MHA中间件(主服务器挂掉可以选举)实现高可用性
适用于读多写少的互联网应用
架构复杂度提升,成本提高
分片的集群模式
及分库分表的集群模式
优缺点
架构的复杂性提上了,成本提高
每个节点数据只是所有数据的一个子集
适用于十亿级数据总量大型应用
不具备高可用性质
分片的算法
范围法
及根据范围进行分割
优点,机构见到那、扩展时比较容易,适合范围i的搜索
缺点:数据分布不均匀,局部的负载压力大,适用于 流水账类型的应用
Hash法
也分为取模(最简单的类型来说就是对于id进行取余)与一致性Hash
优点:数据分配均衡
缺点:提前部署对应足够的节点,适用于预算比较充足的大型互联网应用
分表方式
水平分表
及分库分表形式的分表,表所有的数据结构都是相同的,解决数据量大的一个存储问题
垂直分表
将一张大表按“列”拆分为两张以上的小表,通过外键关联来获取数据(拆分模块就类似于这样,类似于订单表,订单表明细表这些)
InoDB的存储方式 行--->页(page一页大概可以存储16k的数据)-->区(Extent基本时1MB的存储空间即64个页)
在1.0后引入了压缩页的概念:及通过压缩使一页中可以存储更过的数据,跨页需要解压,解压的效率比较低
在1.0后引入了压缩页的概念:及通过压缩使一页中可以存储更过的数据,跨页需要解压,解压的效率比较低
何设计才可以让系统从未分库分表动态切换到分库分表上?
停机迁移方案
对于公司没有停机时间要求的,可以写个工具直接刷数据
双写迁移方案
线上系统里面,之前所有写库的地方,增删改操作,除了对老库增删改,都加上对新库的增删改
然后像第一种一样写个工具,把新库没有的或者老库的变更时间新于新库时间的
子主题
使用的中间件MyCat或者ShardingSphere
0 条评论
下一页