mysql
数据库事务四大特性
- 原子性
- 隔离性
- 一致性
- 持久性
数据库的索引
- 脏读:事务B查看事务A 每天提交的数据
- 不可重复读:一行被检索两次,并且该行,在不同的读取之时不同 其他会话修改数据
读未提交 不可重复读 可重复读(默认) 串行化
存储引擎:
- 都是采用表级别锁
- MYISAM: (非聚集索引)
- 不支持外键 不提供事务 插入数据时 锁定整个表所以每次查询具有原子性
- 可以直接读取行数变量
- INNODB: (聚集索引)
- 支持事务和行级别锁 聚集索引
- 读取行数需要执行查询语句 MYSQl 5.5 之后默认是INNODB
- 考虑存储引擎的几点
- 是否支持事务
- 是否读写频繁
- 系统崩溃后 MyISAM恢复起来更困难
数据库三大范式
- 属性不可分 比如姓名 姓和名
- 非主键属性完全依赖于主键属性: 比如学生id和姓名
- 非主键属性是通过课程 ID 连接起来你不能通过ID 把他们弄在一起
数据库的锁
按照颗粒度来分的话
- 行级别锁:
- 开销大,加锁慢,会出现死锁。发生锁冲突的概率最低,并发度也最高。
- 顾名思义就是对行进行加锁 他的颗粒粒度是最小的
- 还有间隙锁 和
- 表级别锁:
- 开销小,加锁快,不会出现死锁。发生锁冲突的概率最高,并发度也最低。
- 有两种锁
- 读锁锁表
- 写锁锁表
- MYISAM 默认是加表锁的
- INNODB 要加表说就需要显式的声明了
- 有两种锁
- 页级锁
- 是表锁和行锁中间隔离级别的一种锁
- 行级别锁:
按共享策略来分可以分为
- 共享锁 读锁
- 排他锁 写锁
- 意向共享锁 意向排他锁的作用主要是快速判断一个表是否被上锁
从加锁策略来分的 话可以分为
乐观锁 默认对数据的操作是查询比较多 增删比较少
悲观锁 默认修改多查询少 不加锁一定出问题
其他还有一个自增锁 主要用于自增片段
mysql 索引
- 索引算法
- hash 算法实现 不能进行 范围查询 不能排序
- B+ 索引
- 聚集索引非聚集索引
- 聚集索引 按索引的顺序存储 节点中存储正在的物理数据
- 非聚集索引:存储指针 查询非指针数据时需要查询两次、
- 为什么使用索引
- 索引最大的好处是提高查询速度,
缺点是更新数据时效率低,因为要同时更新索引
对数据进行频繁查询进建立索引,如果要频繁更改数据不建议使用索引。 - 为什么用B+ 树 他和B树的区别
- B 所有节点都存储key和data 所有节点组成这颗树 叶子节点为空
- B+ 只有叶子节点存储data 叶子节点包含了这棵树所有的键值 叶子节点不存储指针
数据库的主从复制
为什么需要主从复制
主从复制就是做一个备份的数据库,主数据库崩塌后可以立马切换到从数据库,避免数据丢失
- 主从复制的原理
sql 优化
1 | 子查询变成left join |
1 | // 通过ID 来过滤 |
索引失效的场景
- 未使用该列作为查询条件
- 使用like通配符在前面
- 查询使用OR
redis
缓存雪崩
缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。
解决方案:将缓存失效的时间分隔开
缓存击穿
缓存失效的时候大量请求发送过来
解决方案:用互斥锁 先判断是否失效
失效就先重新设置缓存 在查询
缓存穿透
访问一个不存在的数据
解决方案:先做一个预判断