没有总结的学习就是耍流氓
- 沃·兹基朔德
大多数学习的时候太过于零散,有的时候看到了一篇很好的文章,想找个时间沉下心来好好学习,可是转眼就又给忘了。
看完一本书,也许当时思考过,有一定印象。但是总会遗漏点什么,等真正有需要的时候,往往就真的是有影响。
学完一个知识,想要写个博客文章记录一下,可是耗费时间而没有坚持下来,所以知识没有得到积累。
虽然一直在不断得学习,但是感觉自己太过于浮躁,很多时候的学习并没有真正的沉淀下来,过一阵时间又给忘了。经常想做总结,却有被自己的懒惰和借口拐跑了。
所以本篇博客主要是:
- 记录看到的好的文章,便于后面有需要进行快速检索
- 记录自己的学习过程,等过几年回过头来看自己的成长
- 记录生活轨迹,等老了看看自己虚度多少时光
于2020-04-04 北京 天通苑
技术文章汇总
MySQL
死锁系列
- 漫谈死锁 (1. RC级别下也会存在Next-key 2. RC级别下,获取到不符合记录时会释放锁)
- innodb_print_all_deadlocks (将死锁信息记录到errorlog中参数)
- innodb_status_output_locks (标准监控开关参数)
- 如何阅读死锁日志 (锁组合)
- MySQL 各种SQL语句加锁分析
- innodb_locks_unsafe_for_binlog
- 死锁案例一 (简单插入唯一索引插入意向锁案例)
- 死锁案例二 (delete操作会有锁区间行为。PS:删除已有记录会导致锁范围变大)
- 死锁案例三 (insert同一区间时,唯一索引的插入意向锁导致的死锁)
- 死锁案例四 (并发插入时,插入意向锁不同阶段死锁。注意跟案例三的区别:本案例为X锁等待,案例三为S锁等待)
- 死锁案例五 (repalce into插入死锁情况)
- 死锁案例六 (不同事务加锁顺序不一样,导致锁资源交叉影响导致的死锁)
- 死锁案例七 (RC级别下,update不存在记录会持有lock_S + GAP锁)
- 死锁案例八 (多并发插入下的又一插入意向锁竞争导致的死锁案例)
- 死锁案例九 (并发批量插入,导致的死锁)
- 死锁案例十 (并发更新普通二级索引造成的死锁。PS:另一程度上说明索引不是随便加就行)
- 死锁案例十一 (5.6升级到5.7后,INSERT INTO .. ON DUPLICATE KEY语句锁模式加强)
- 死锁案例十二 (唯一索引,多插入,插入意向锁死锁情况)
- 一个最不可思议的死锁分析 (并发delete语句造成的死锁情况,里面引用了很多好文章,需要细品)
分析死锁单从show engines innodb status
中往往只能看到最后执行的语句,并不能很好的了解整个死锁形成过程。所以在分析死锁时,需要先了解两个死锁事务的具体逻辑和语句过程。
了解MySQL不同操作的加锁过程非常重要,这是对死锁形成过程分析的基础。
故障及优化案例系列
- 引号错位引起的故障 (我才不会告诉你踩过的一个坑:update xx set a=’x’ and b=’x’ where …)
- 一个事务中调整语句顺序 (MySQL45讲中也说过:一个事务中,只有需要锁的时候才会去申请锁,事务提交时才会释放锁。所以将锁资源较多的语句放在后面执行。)
- 库表字符集修改后,老字段仍为原来字符集 (修改库表字符集后,只会改变新增的字符集)
- 聊聊 隐式转换 (真实遇到过其中的字符串转换成浮点型比较,查询结果不准确的问题。实测当长度为17位时会有问题)
- 一个特殊的隐式转换问题 (5.6版本IN中包括多个类型的话,会存在不能走索引的情况。相关阿里月报)
- Strace 解决性能问题案例一则 (问题排查工具,用事实说话,DB不背锅)
- 业务优化案例一则 (mysqlslap压测工具使用)
- MySQL 案例一则 (explicit_defaults_for_timestamp参数解释)
- explicit_defaults_for_timestamp
- 再说 order by 优化 (很精髓的order by案例总结和优化建议。)
- 一次大量删除导致 MySQL 慢查的分析 (由于MVCC特性,如果存在长时间未提交的事务,会导致简单查询也可能会变得很慢)
- MySQL 大量sleeping before entering InnoDB 故障诊断 (很详细的一次问题排查步骤,里面有很多有用的命令)
- 哪些因素会导致慢查询? (从应用到数据库,非常全面的列出了变慢的原因 加一个:limit 时匹配不到数据会一直扫描。)
SQL变慢的原因主要有:
- SQL执行过程走索引不合理,导致执行缓慢。
- 使用合理索引,但是获取数据量比较多。(排序,临时表等)
- 网络重传丢包导致SQL变慢。
- 并发比较高的场景,请求排队处理,等待时间长。
性能优化是一个老生常谈的问题,需要对相关流程和机制有很深入的研究才能对症下药。平时扩充、积累相关知识,在遇到问题后,才会有思路。经验很重要,但更多的是建立在平时的积累上。
性能对比
- MySQL centos 6 vs 7的性能对比
- xfs vs ext4 性能压测对比 (先mark,后面再细细品)
源码解析
- 主从替换之后的复制风暴 (复制风暴、seconds_behind_master计算方式)
- show status和set gtid_mode 导致线程死锁案例 (TODO:gdb和通过源码分析问题思路实操)
参数系列
工具相关
- 使用innobackup 2.4遇到的问题 (2.2是不能备份5.7 版本)
Redis
- Redis和IO多路复用
- Redis主从复制演变过程 (很好的讲解了Redis各版本中复制的演变)
- Redis Sentinel 高可用实现说明 (要是早半个月看到这篇文章多好。自需求+正好遇到了文中提到的坑。PS:加一个坑:主从实例不能重命名config命令)
C/C++
- C/C++内存对齐 (Redis 4.0中对sdshdr对象进行了内存对齐优化行为)
Java
- 深入分析线程池的实现原理 (从源码级别分析了ThreadPoolExecutor类的实现)
Linux命令
操作系统
计算机网络
数据结构和算法
其他
LeetCode题目记录
5:最长回文子串(中心扩展、马拉车算法)
42:接雨水(简单DP、单调栈)
820:单词的压缩编码(字典树)
个人成长文章
职场
个人成长
理财
学习计划
书籍
- Java开发规范(2020.04.07 done)
- 向上管理的艺术(2020.04.19 done)
- 图解HTTP(2019.04.19 done)
- 用户故事地图
- Redis开发与运维
- MongoDB权威指南
- GO语言核心编程
技术储备
- 时序数据库(调研)
- elasticsearch(极客时间视频)
- 从0开始学架构(2020.04)
准备学习的东西记录
- 图解MySQL
- 动态代理、CGLIB代理
- MySQL闪回工具binlog2sql和MyFlash工具问题记录
- Having和where的区别
- MySQL的ICP特性
- MySQL的BKA特性
- 重新回顾一遍MySQL45讲
- Reactor 设计模式
- interactive_timeout和wait_timeout
- innodb_thread_concurrency和innodb_concurrency_tickets
- innodb_online_alter_log_max_size
- DDL 过程回顾
- gdb调试MySQL和Redis
- Cmakefile文件的编写
学习总结
- 《向上管理的艺术》小结