数据库基础
事务
事务是指由构成单个逻辑处理单元的一组数据库访问操作,这些操作的SQL语句被封装在一起,它们要么都被成功执行,要么都不被执行,其中每条sql语句执行后并不立即执行数据库,而是commit之后才将所有sql执行结果提交
事务特性
- 原子性
- 一致性: 一种正确数据状态变到另一种正确状态
- 隔离性: 并发执行的事务不能相互干扰,隔离级别
- 持续性: 事务提交之后对数据库中数据的改变是永久的
事务并发后果
- 脏读: 读了被另一个并发事务修改但是未提交成功的脏数据
- 不可重复读: 读到数据之后,数据被另一个事务修改,也就是两次读到的数据不一样
- 幻读: 对同意共享数据进行读,发现第二次增加了新增数据
- 丢失更新: 对共享数据更新之后,再次读发现和更新的值不一样
事务隔离级别
- 读未提交: 导致脏读等以上所有情况
- 读已提交: 可避免脏读,但还会出现其他情况
- 可重复读: 可避免脏读,不可重复读
- 可串行化: 可避免脏读,不可重复读,幻像读,丢失更新
越到后面,并发性能越低
事务分类
- 扁平事务: 频繁简单,操作都是同一层次的,要么全部执行,要么都不执行
限制: 不能提交或者回滚事务的某一部分,或分几个步骤提交 - 带有保存点的扁平事务: 允许在事务执行过程中回滚到同一事务中较早的状态, 设置保存点,用于保存事务的某一状态
限制: 当系统崩溃时,保存点全部消失,易失去的 - 链事务: 在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式的传给下一个要开始的事务。提交事务操作和开始下一个事务操作将合并为一个原子操作。这就意味着下一个事物将看到上一个事务的结果,就好像在一个事务中进行一样。
- 嵌套事务: 层次结构。由一个顶层事务(top-level transaction)控制着各个层次的事务。顶层事务之下嵌套的事务被称为子事务(subtransaction),其控制每个局部的变换。
- 分布式事务: 通常是一个在分布式环境下运行的扁平事务,因此需要根据数据所在的位置访问网络中的不同节点
数据库优化
三大范式
- 第一范式: 属性原子性,不可再分
- 第二范式: 消除部分函数依赖,非主属性必须依赖于主属性
- 第三范式: 消除传递依赖,非主属性必须直接依赖于主属性,不能传递依赖
数据库完整性
- 实体完整性: 主键唯一,非空
- 参照完整性: 主键和外键一致,外键可以为空,但不能不正确
- 用户自定义完整性: 对某一列数据的约束
分库分表
- 垂直拆分: 垂直拆分就是要把表按模块划分到不同的数据库中,数据库按模块和功能把表划分出来,趋向于服务化
- 水平拆分: 水平拆分就是要把一个表按照一定的规则把数据划分到不同的表或数据库中. 比如按时间,账号规则,年份,取模算法等.
分表缺点
- 分页查询困难
- 查询非常受限
解决办法
一般主表存放所有数据,再根据业务进行水平拆分,mycar分表功能.
慢查询
MySQL默认10秒内没有响应SQL结果,则为慢查询
可以修改MySQL慢查询默认时间
修改慢查询
--查询慢查询时间
show variables like 'long_query_time';
--修改慢查询时间
set long_query_time=1; ---但是重启mysql之后,long_query_time依然是my.ini中的值
索引和主键区别
key: 一种物理结构,有两方面意义
- 约束: 保重数据库完整性
- 索引: 辅助查询
主键
约束作用: 用来规范一个存储主键和唯一性,同时也在此key上建立了一个主键索引, mysql自动对主键建立 Unique Index
- 主键唯一标识数据库表中的每条记录
- 主键必须包含唯一的值
- 主键列不能为NULL
- 每个表中应该有且只有一个主键
Unique key
约束作用: 规范数据唯一性,并在上面建立唯一索引,唯一标识一条记录
- 主键与Unique Key都为列提供了唯一性保证,区别是一个表中可以有多个Unique key,只能有一个主键
- mysql的Key都有约束和index两方面意义
索引
- index是数据库的物理结构,只辅助查询,它创建时会在另外的表空间, 以类似目录的结构存储。
- 索引分为前缀索引、全文本索引等;
- 索引只是索引,不会去约束索引的字段的行为(那是key要做的事情)
索引分类
主键索引: 必须指定为“PRIMARY KEY”,没有PRIMARY Index
唯一索引: unique index,一般写成unique key
普通索引: index,只有这一种才是纯粹的index
数据库备份
- 完全备份
常用, 备份整个数据库,包含用户表、系统表、索引、视图和存储过程等所有数据库对象。但是也需要花费更多的时间和空间,所以,一般推荐一周做一次完全备份。 - 事务日志备份
事务日志是一个单独的文件,它记录数据库的改变,备份的时候只需要复制自上次备份以来对数据库所做的改变,所以只需要很少的时间。为了使数据库具有鲁棒性,推荐每小时甚至更频繁的备份事务日志。 - 差异备份
也叫增量备份, 它是只备份数据库一部分的另一种方法,它不使用事务日志,相反,它使用整个数据库的一种新映象。它比最初的完全备份小,因为它只包含自上次完全备份以来所改变的数据库。它的优点是存储和恢复速度快。推荐每天做一次差异备份。 - 文件备份
数据库可以由硬盘上的许多文件构成。如果这个数据库非常大,并且一个晚上也不能将它备份完,那么可以使用文件备份每晚备份数据库的一部分。由于一般情况下数据库不会大到必须使用多个文件存储,所以这种备份不是很常用。
数据库恢复
数据库恢复技术是利用数据库备份文件和数据库事务日志文件来实现数据库恢复处理。应根据用户恢复要求,采用前滚事务方式或回滚事务方式恢复数据库。
前滚
- 若需要对故障前的数据库备份文件进行恢复,可采用前滚事务恢复方式
- 前滚代表着恢复,也就是未完成的事务,让其继续执行完
- 从内存写到磁盘
未完全提交的事务,即该事务已经被执行commit命令了,只是现在该事务修改所对应的脏数据块中只有一部分被写到磁盘上的数据文件中,还有一部分已经被置为提交标记的脏块还在内存上,如果此时数据库实例崩溃了,则当数据库实例恢复时,就需要用前滚(这个机制)来完成事务的完全提交,即将先前那部分已经被置为提交标记且还在内存上的脏块写入到磁盘上的数据文件中
回滚
- 若需要对故障后的数据库备份文件进行恢复,可采用回滚事务恢复方式。
- 撤销
- 已写入磁盘的部分脏数据撤销掉
未提交的事务,即该事务未被执行commit命令。但是此时,该事务修改的脏块中也有可能一部分脏块写入到数据文件中了。如果此时数据库实例崩溃了,则当数据库实例恢复时,就需要用回滚(这个机制)来将先前那部分已经写入到数据文件的脏块从数据文件上撤销掉。
常考SQL语句
查找学生成绩单里两门成绩>80的学生名字
select s.name from student s
where s.score > 80
group by s.name
having count(*)>=2;
mysql怎么优化Mysql
数据库的备份是如何实现的
mysql创建一个学生表,包含id(int)和name(string),主键的创建:CREATE TABLE stu(id INT (5), name VARCHAR (100), PRIMARY KEY (id));
mysql建立索引 CREATE INDEX index_name ON table_name (column_list) CREATE INDEX idx_c4 ON t(c4);
数据库查询10-20行内容:select * from stu limit 10, 10;
查找135开头的电话:select * from table where tel like ‘135%’;
left join, right join和inner join的影响性能的因素