数据库原理、sql语句、mysql数据库、数据库优化、redishtml
知识点:事务、范式、多粒度和意向锁、XS锁、封锁协议、两段锁协议、死锁、隔离级别mysql
事务就是指数据库的要作的一件事情,能够是一条sql语句,能够是一系列操做。把这些操做整体看成一个要么完成要么不完成的事情来看,完成就是commit,不完成就是rollbackgit
事务的四个特性:github
A 原子性 要么完成,要么rollbackredis
C 一致性 事物之行先后保持一致性sql
I 隔离性 事务之间不影响也不可见数据库
D 持久性 修改是永久的,即便系统奔溃,也不能够出问题缓存
服务器
脏数据、不可重复读、修改丢失、幻影读多线程
脏数据:就是读出来的数据,因为被别人修改了,可是丢改又取消了,其实没有修改,可是读出来的数据是修改的,因此是脏数据
不可重复读:读了两次数据,可是读的时候,别的事务修改了数据的值,致使读的不对
修改丢失:多个事务同时读取数据,而后修改,可是先写入的被后修改的覆盖了
幻影读:范围读取的时候,因为别的事务的修改,致使两次读取结果不同
写锁X:加了以后,只有我能够读改数据,其余程序不能够读写
读锁S:加了以后,只有我和其余加了读锁读事务能够读,不能够写也不能够加X锁,只能够加S锁
一级、二级、三级封锁协议
一级封锁协议:写入以前加X锁,直到事务结束,释放X。防止丢失修改,同时只有一个事务能够修改数据
二级封锁协议:一的基础上,在读取以前加S,读完释放S。防止读取脏数据,由于A修改x的值的时候,没办法第二次读取,若是回滚了,读取到的数据是脏数据。
三级封锁协议:一的基础上,读以前加S,事务结束释放S。防止不可重复读。
锁的粒度能够是表级也能够是行级别,mysql中myisam就是表,innoDB就是行级别
意向锁:为了更好的支持多粒度锁
IX锁:获取某个行的X锁以前,须要得到表的IX锁
IS锁:获取某个行的S锁以前,须要得到表的IS锁及更强锁
表的IX锁和X锁不兼容,就是说加了IX,不能够加表的X,只能加行的X
原理:
没有意向锁的话,若是想获取一个表的X锁,就须要对表的X锁和每一行的X锁进行检测,很是消耗资源。
可是有了意向锁就不同了,若是有一个事务得到了行的X锁,那它必定得到了表的IX锁,其余事务若是想来获取这个表的锁,就不能够,只能得到行的X锁
就是说加锁和解锁分为两段来执行,能够对不一样事务中的全部加锁解锁操做串行,判断是否能够冲突可串行化调度
冲突可串行化调度,就是说按照一个串行顺序调度,不会出现死锁
预防:一次封锁法:一次得到全部资源,顺序封锁法:按照一个合理的顺序封锁
诊断和解除:超时法,等待图法(检测回路),从一个最小事务,释放它的全部资源
未提交读:修改未提交就能够读,不能防任何
已提交读:只能读取已经提交的结果,能够防止脏数据
可重复读:事务屡次读取结果同样,防止不可重复读,不防幻影
可串行化 :事务串行执行,不会互相干扰,不会出现一致性问题,须要加锁实现
InnoDB实现提交读和可重复读的一种实现。可串行没法实现。
基本实现:
数据有版本快照,只能够读取已经提交的快照,从而防止脏数据和不重复读,脏数据和不重复读是因为读取了为提交的修改致使的。
多版本指的是多个版本的快照,储存在Undo日志中。
每个事务会有一个版本号。日志就记录了操做这些数据的版本号等信息。
ReadView结构,里保存了未提交的事务列表的版本号,经过比较快找的版本号和列表的版本号,若是快照小,则修改成提交,可使用,若是快照大,则不能使用,若是在列表中间,则须要判断在列表中就表示没提交,提交读不可,不在就能够提交读。可重复读不能够。
MVCC不能够解决幻影读,因此使用nextkeylocks解决幻影读
recordlocks和gaplocks结合,锁定索引的一个区间
MCVV详解参考:https://www.codercto.com/a/88775.html
第1、第2、第三范式
第一范式:属性不可分
第二范式:非主属性只依赖键码
第三范式:不存在非主属性的函数依赖传递
BCNF:每一个决定因素都包含码(个人理解是都在码内)
第四范式:没有非平凡的非函数依赖的多值依赖
多值依赖:就是说ABC三属性,AC虽然决定B,可是B中不少组值(B1B二、B3B4B5)只取决于A。
好比课程、老师、书本,不一样老师用不一样的书,一门课好几个老师,课程能够决定一坨老师和书,
因此老师和书都是对课程多值依赖的。
非平凡就是C不为空,例子里就是有课本。
以前是myisam,如今是InnoDB
InnoDB:支持事务,支持行级锁、支持外键、聚簇索引、多版本控制、commit和rollback、热备份
myisam:不支持事务,表级锁、不支持外键、非聚簇索引
B+Tree索引或者哈希索引
哈希索引:O1复杂度,查询速度快,只支持单个条目查询
B+tree索引:支持范围查找
全文索引:倒排索引实现,记录关键字到文档的映射。用于全文查找关键字
空间数据索引:myisam支持,用于地理数据存储。空间数据索引会从全部维度来索引数据,能够有效地使用任意维度来进行组合查询。
BTree比红黑好:1由于出度大,因此查找快。2磁盘预读,索引和文件放在一块儿
单列索引、多列索引、前缀索引、覆盖索引
覆盖索引:索引包含须要查询的字段的值
优势:加快查询速度,随机IO变顺序IO,避免排序和分组创立临时表
使用:中大型表,特大表代价太大,小表直接扫描
https://github.com/Snailclimb/JavaGuide/blob/master/docs/database/MySQL%20Index.md
InnoDB
Record lock:单个行记录上的锁
Gap lock:间隙锁,锁定一个范围,不包括记录自己
Next-key lock:record+gap 锁定一个范围,包含记录自己
限定数据的取值范围
读写分离,主库写,从库读
垂直分区:按照相关性和列拆分乘多个表,优势:减小读取数据量,缺:增长了冗余和链接
水平分区:水平拆分能够支持海量的数据
分区要谨慎使用,否则跨区会有很大代价
限制索引数量
最左侧原则
频繁查询和使用的列索引
频繁更新的列不要索引
避免冗余的索引
redis是一个内存中的Nosql数据库,普遍用于缓存方向。也常常用来作分布式锁。此外还支持事务,支持LUA脚本,支持持久化和集群方案。高性能,高并发。
单线程,单线程实际上是指他的文件事务分派器是单线程的。
redis是因为:
多个socket
IO多路复用程序
文件事务分派器
时间处理器
组成。
流程:多个socket并发产生多个操做,而后IO多路复用程序从socket中监听,将socket中时间放在一个队列中,文件事务分派器按照事务将事件一个一个派发给事件处理器。
类型:redis是数据库,而memcached是缓存系统
数据类型:redis五种,string、set、map、list、Zset
集群:redis原生支持,memcached不支持,须要程序支持
线程:redis是单线程的非阻塞IO复用,memcached是多线程的多路IO复用
持久化:redis支持持久化,memcached只是一个缓存系统
操做:redis:批量操做、假事务、不一样类型不一样curd,memcached支持curd和其余少许操做
能够设置过时时间。
按期删除:按期扫描必定数量的设置了过时时间的key,过时则删除。不所有扫描,由于开销太大。
惰性删除:按期删除确定长时间会存在不少没有被删掉的过时变量,须要惰性删除,就是说检查一下这个key,而后删除。
由于删除还会致使大量过时的变量,因此引入淘汰机制
6种
设置了过时中最近最少使用
设置了过时中最快过时
设置了过时中随机
全部中最近最少使用
全部中随机
不删除
4.0后加了两种:
设置了过时中最少使用
所有中最少使用
快照持久化:按期产生快照,而后对快照进行备份
AOF持久化(只追加文件持久化):每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。每秒同步一次,最多损失一秒的数据。实时性很好,是目前对主流方案。
4.0后支持混合持久化
事务提供了一种将多个命令请求打包,而后一次性、按顺序地执行多个命令的机制,而且在事务执行期间,服务器不会中断事务而改去执行其余客户端的命令请求,它会将事务中的全部命令都执行完毕,而后才去处理其余客户端的命令请求。redis支持事务的方式就是一块儿作,顺序执行。
缓存穿透:大量的请求不在缓存中,须要请求数据库
解决方法:处理无效key过时、布隆过滤器(相似于白名单,判断key是否合法)
缓存雪崩;短期缓存大量失效,致使请求直接交给数据库
解决方法:事前:保证redia集群的高可用性,选择合适的淘汰机制,事中:ehcache缓存 + hystrix限流&降级,避免MySQL崩掉,过后:持久化机制快速回复。
略