数据库知识要点,面试向

数据知识要点

数据库原理、sql语句、mysql数据库、数据库优化、redishtml

数据库原理

知识点:事务、范式、多粒度和意向锁、XS锁、封锁协议、两段锁协议、死锁、隔离级别mysql

事务ACID

事务就是指数据库的要作的一件事情,能够是一条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锁

两段锁协议

就是说加锁和解锁分为两段来执行,能够对不一样事务中的全部加锁解锁操做串行,判断是否能够冲突可串行化调度

冲突可串行化调度,就是说按照一个串行顺序调度,不会出现死锁

死锁

预防:一次封锁法:一次得到全部资源,顺序封锁法:按照一个合理的顺序封锁

诊断和解除:超时法,等待图法(检测回路),从一个最小事务,释放它的全部资源

隔离级别

未提交读:修改未提交就能够读,不能防任何

已提交读:只能读取已经提交的结果,能够防止脏数据

可重复读:事务屡次读取结果同样,防止不可重复读,不防幻影

可串行化 :事务串行执行,不会互相干扰,不会出现一致性问题,须要加锁实现

多版本并发控制MVCC

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不为空,例子里就是有课本。

mysql数据库

对比

以前是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/%E6%95%B0%E6%8D%AE%E5%BA%93%E7%B4%A2%E5%BC%95.md

https://github.com/Snailclimb/JavaGuide/blob/master/docs/database/MySQL%20Index.md

InnoDB

  • Record lock:单个行记录上的锁

  • Gap lock:间隙锁,锁定一个范围,不包括记录自己

  • Next-key lock:record+gap 锁定一个范围,包含记录自己

 

数据库优化

大表优化

限定数据的取值范围

读写分离,主库写,从库读

垂直分区:按照相关性和列拆分乘多个表,优势:减小读取数据量,缺:增长了冗余和链接

水平分区:水平拆分能够支持海量的数据

分区要谨慎使用,否则跨区会有很大代价

索引优化

限制索引数量

最左侧原则

频繁查询和使用的列索引

频繁更新的列不要索引

避免冗余的索引

 

 

其余优化和规范

https://github.com/Snailclimb/JavaGuide/blob/master/docs/database/MySQL%E9%AB%98%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E8%A7%84%E8%8C%83%E5%BB%BA%E8%AE%AE.md

 

 

 

redis数据库

redis是一个内存中的Nosql数据库,普遍用于缓存方向。也常常用来作分布式锁。此外还支持事务,支持LUA脚本,支持持久化和集群方案。高性能,高并发。

线程模型

单线程,单线程实际上是指他的文件事务分派器是单线程的。

redis是因为:

多个socket

IO多路复用程序

文件事务分派器

时间处理器

组成。

流程:多个socket并发产生多个操做,而后IO多路复用程序从socket中监听,将socket中时间放在一个队列中,文件事务分派器按照事务将事件一个一个派发给事件处理器。

redis和memcached区别

类型: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崩掉,过后:持久化机制快速回复。

 

 

sql语句

 略

相关文章
相关标签/搜索