这篇博文主用来记录读到的MySQL相关的文章
机制系列
- MySQL 通讯协议:客户端与服务端连接过程中,密码怎样传输
- 活久见,为什么SHOW TABLE STATUS总是不更新
- 图解MySQL MySQL组提交(group commit)
故障及优化案例系列
- 大规模多存储场景的数据库选型与服务平台建设
- 引号错位引起的故障 (我才不会告诉你踩过的一个坑: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 时匹配不到数据会一直扫描。)
- 由MySQL复制延迟说起 (分析了复制延迟的主要原因和解决办法)
- 为何COUNT很慢却不写SLOW LOG:slow log记录规则
- 故障分析 | MySQL 优化案例 - select count(*)
SQL变慢的原因主要有:
- SQL执行过程走索引不合理,导致执行缓慢。
- 使用合理索引,但是获取数据量比较多。(排序,临时表等)
- 网络重传丢包导致SQL变慢。
- 并发比较高的场景,请求排队处理,等待时间长。
性能优化是一个老生常谈的问题,需要对相关流程和机制有很深入的研究才能对症下药。平时扩充、积累相关知识,在遇到问题后,才会有思路。经验很重要,但更多的是建立在平时的积累上。
死锁系列
- 漫谈死锁 (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不同操作的加锁过程非常重要,这是对死锁形成过程分析的基础。
MySQL8.0系列
- MySQL8.0到目前为止有哪些真香特性
- 8.0 新特性
- MySQL8.0中已移除的特性,功能
- MySQL 8.0 clone plugin 完整版:官方支持的一种全新的数据库备份恢复方式。
- 真香,MySQL 8.0.20,10倍性能提升:doublewrite性能优化,由全局锁减小为实例锁
- 技术分享 | Hash join in MySQL 8
- MySQL 8.0 hash join有重大缺陷?
- 一文读懂MySQL 8.0直方图:不用加索引的优化方式,需要手动更新
- MySQL 8.0中对EXISTS、NOT EXISTS的持续优化:从8.0.16开始,增加对EXISTS的优化,和IN一样也支持自动转换成semi join
- 新特性解读 | 趋近完美的 Undo 空间
- 七个实验掌握 MySQL 8.0 角色功能
- 新特性解读 | MySQL 8.0 索引特性4-不可见索引
- 新特性解读 | MySQL 8.0 索引特性3 -倒序索引
- 新特性解读 | MySQL 8.0 索引特性2-索引跳跃扫描
- MySQL 8.0 之Index Skip Scan
- MySQL 8.0.12 instant add column 体验,亿级数据秒速增加字段
- 新特性解读 | binlog 压缩:MySQL 从 8.0.20 开始集成 ZSTD 算法,推出binlog 压缩功能
- 新特性解读 | 说说 MySQL 8 对于持久化变量的一些修改:在命令行修改参数值的同时进行持久化,避免忘记修改配置文件导致实例重启后出现未知的问题。
- 新特性解读 | 8.0 新增 DML 语句(TABLE & VALUES)
- 新特性解读 | mysql 8.0 memcached api 新特性:NOSQL机制集成的又一体现。使用telnet连接MySQL时遇到问题,可能原因看下面这篇文章
- MySQL 8.0.14 新的密码认证方式和客户端链接:新加密方式(caching_sha2_password)
- MySQL 8.0密码认证机制升级,不知道可能导致业务不可用:客户端与服务端加密方式不一样导致连接失败。
- 解密MySQL 8.0 multi-valued indexes:MySQL 8.0.17起,InnoDB引擎新增了对JSON数据类型的多值索引
- MySQL 一个历史遗留“BUG”:行锁多锁一条记录,MySQL45讲中提到过这个问题
- MySQL 8.0 InnoDB压缩行格式性能测试:新的压缩算法不会减少多少占用,在一定程度上影响了性能。需要根据业务场景谨慎选择
- MySQL 8.0.19客户端的一个小变化:默认当查询到的数据有二进制数据的话,就会用十六进制方式展示出来
源码解析
- 主从替换之后的复制风暴 (复制风暴、seconds_behind_master计算方式)
- show status和set gtid_mode 导致线程死锁案例 (TODO:gdb和通过源码分析问题思路实操)
其他
- MySQL centos 6 vs 7的性能对比
- xfs vs ext4 性能压测对比 (先mark,后面再细细品)
- 使用innobackup 2.4遇到的问题 (2.2是不能备份5.7 版本)
- MySQL DBA如何利用strace/pstack/gdb来定位问题
- MySQL在线加字段实现原理