数据库

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
2
3
4
子查询变成left join
where代替having,having 检索完所有记录,才进行过滤
避免嵌套查询
对多个字段进行等值查询时,联合索引
1
2
3
// 通过ID 来过滤
select * from table limit 100000,20
select * from table where id > (select id from table limit 100000,1) limit 100000,20

索引失效的场景

- 未使用该列作为查询条件
- 使用like通配符在前面
- 查询使用OR

redis

  • 缓存雪崩

    缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。

    解决方案:将缓存失效的时间分隔开

  • 缓存击穿

    缓存失效的时候大量请求发送过来

    解决方案:用互斥锁 先判断是否失效

    ​ 失效就先重新设置缓存 在查询

  • 缓存穿透

    访问一个不存在的数据

    解决方案:先做一个预判断

Donate comment here