这是我参与8月更文挑战的第29天,活动详情查看:8月更文挑战
一、数据库
1. MySQL
- 手撕SQL:找到有3门科目不及格的前三名学生。(group by ... having count(*) ...)
- Innodb 并发读写锁 MVVC 算法(多版本并发控制,用于读已提交、重复读的情况):对比版本号(时间戳),类似CAS。
- 两种常用引擎:MyISAM,Innodb;区别:读多还是写多,是否支持全文搜索、行锁、故障恢复、同时读写(In有两段锁)。
- Mysql 慢查询(日志):需要修改配置去开启。配合
explain指令分析 SQL 效率。 - 针对隔离性遇到的问题:脏读,不可重复读,幻读。
- 第一范式:列值是原子的。第二范式:有候选码。第三范式:某一列不依赖其他非主列。BCNF:任何非主属性不能对主键子集依赖。
- SQL优化:①增加合适的索引,查询时覆盖索引;②避免使用in关键字和子查询,改用join联表查询;③避免使用左模糊和全模糊like匹配查询,建议用搜索引擎代替;④limit限制查询条数,优化分页效率;⑤排序时尽量利用索引的有序性提升效率;⑥超多分页场景下利用延迟关联或者子查询优化;⑦避免设置唯一索引,影响insert效率;⑧不使用外键与级联,应在应用层解决。
- MySQL两段锁即加锁、解锁阶段(提交或回滚)。锁又分为共享锁(读锁)和排它锁(写锁)。
- MySQL 的 XA 两阶段提交(用于分布式数据库):Prepare + Commit,P【向所有数据库服务器发送 prepare 通知,进入 ready 可提交状态】C【若第一阶段出现任一失败则事务失败,否则事务管理器发出“确认提交”请求,最终数据库服务器返回“提交完成”响应】。
- select for update (of A.id) 在查询时开启事务,of 语句可针对指定的表加锁,不加 of 则默认所有涉及的表都加锁。
2. 事务
- 四种隔离级别:未提交读,提交读,可重复读,序列化(串行)
- 并发下出现的问题:脏读(读了未提交的数据)、不可重复读(更新)、幻读(新增或删除)
- ACID:原子性,一致性,隔离性,持久性
- TCC分布式事务: try + confirm/cancel(rollback)
3. Redis
- 基本数据类型:键值对、哈希表、列表、集合、有序集合。
- 持久化方式:① RDB:指定时间间隔内触发某种条件,生成数据快照,缺点是备份慢实时性较低;② AOF:日志文件追加,缺点是恢复慢。
- 键值过期清理策略:①[被动清除]:定时轮询清除过期键。② [主动清除]:再次访问时发现键已过期,执行清除并返回获取失败。③ [主动内存]不足清除:需要额外空间时优先清除过期键释放内存。
- 操作系统:①进程和线程的区别:进程是系统资源基本单位;线程是CPU调度的基本单位,共享进程的资源。② 通信方式:有名管道(无名管道),Socket套接字,消息队列,共享内存(进程内)
4. 死锁必要四个条件:
- 互斥条件:资源只能被一个进程独占。
- 请求和保持条件:请求新资源时,不释放已占有的资源。
- 不可剥夺条件:不可强制抢占其他进程已经占用的资源。
- 环路等待条件:存在资源请求的环路。