数据库事务
是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元(Unit)。
狭义上的事务特指数据库事务。一方面,当多个应用程序并发访问数据库时,事务可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。另一方面,事务为数据库操作序列提供了一个从失败中恢复到正常状态的方法, 同时提供了数据库即使在异常状态下仍能保持数据一致性的方法
- ACID:
- Automicity:原子性,强调事务作为原子级别已经不可以再被分割,要么成功要么失败
- Consistency:一致性,即状态转换必须是由一种正确的状态转换到另外一种正确的状态
- Isolation:隔离性,即相互间必须不能被影响,处理并发的问题
- Durabillity:持久性,即事务提交后将被永久保存,即便出现其他故障,事务处理结果也应得到保存。
- 若不考虑Isolation则会有三个问题:??下面哪一个不是啊??
- 脏读:B事务读取到了A事务尚未提交的数据(没提交可能会回滚,导致读到了错误的数据)
- 不可重复读:一个事务中两次读取的数据的内容不一致(在这两次中别的事务修改了数据)
- 幻读:一个事务中两次读取的数据的数量不一致()
- 丢失修改:多个并发事务修改,前面的被后面的覆盖掉
- 隔离级别分为三个:
- read uncommitted:哪个都不能解决。对读的数据不加锁
- read commited:解决脏读,oracle默认。对读的数据加行级共享锁
- repeatable read:可重复读,解决脏读和不可重复读,mysql默认。读加共享锁,写加排它锁
- serializable:相当于锁表,能解决三个问题。
MySQL语法
- 查询最新的10条数据。
1
select * from table order by id desc limit 10
索引
- 索引是什么?
索引就像书的目录。了解一下平衡树 - 没加主键之前,数据都是很整齐的顺序排列,加了主键之后,就成树状了,可以说整个表成了一个索引,这就是聚集索引
- 聚簇索引和非聚簇索引
聚簇索引 | 非聚簇索引 |
---|---|
多行检测快 | 单行检测快 |
按照数据存分的物理位置为顺序的 | 不是 |
叶子节点即为数据块 | 叶子节点还是索引 |
- 索引不是越多越好?
大多数情况下索引能大幅度提高查询效率,但是!数据的变更(增删改)都需要维护索引,因此越多意味着维护成本越高,意味着需要更多的空间
比较小的表可能建立索引后更慢 - 什么时候不适合建立索引?
- 表太小
- 经常插入、删除、修改的表
- 数值重复且分布均匀 ?为什么
- 索引为什么快?
如果你采用合适的算法遍历整个树,可以得到一个有序的列表。这也是为什么如果有数据库索引的情况下,你order by你索引的值,就会速度特别快,因为它并没有给你真的排序,只是遍历树而已。
范式
- 三大范式:
- 每列保持原子性
- 每列都与主键相关
- 每列都与主键直接相关而不是间接相关
- …
多表连接
- 自然连接:要求属性值相同的行,并消除重复属性列
- 内连接:保证两个表分所有行都要满足连接条件,不过不要求属性值相同
- 外连接:
- 左外连接:以左边为准,右边没有的填null
- 右外连接:以右边为准,左边没有的填null
数据库的锁
- 共享锁
允许多个线程访问同一资源,例如读写锁read状态 - 互斥锁
在访问资源之前加锁,访问完成之后解锁。其他任何试图再次加锁的都会被阻塞,直到当前进程解锁。例如读写锁write状态
数据库的备份与恢复
备份:将源数据再次存储到新的位置。三种常见的:完全备份、增量备份、差异备份。
- 备份的内容:
- 数据
- 二进制日志
- InnoDB存储以前的事务日志文件
- 代码——存储过程,存储函数,触发器,事件调度器等
- 当前服务器上用于启动数据服务是所使用的配置文件
- 操作系统上与MySQL或MariaDB相关的配置——sudo任务、cron任务等
- 恢复:
将备份好的数据重新应用到数据库系统
大规模数据库设计
- 把经常用的和不经常用的分开几个表,横向切分
- 不同类型的分成几个表,纵向切分
- 服务器放几个硬盘,把数据、日志、索引分盘存放,提高I/O吞吐率
- 建立统计表(cache),避免每次查询都统计一次
- 注意负载均衡
一个每秒百万级访问量的互联网服务器,每个访问都有数据计算和I/O操作,如果让你设计,你怎么设计?
- 设计成分布式的,将这些请求分给多台服务器去处理,每台都有着相同的数据、日志