明明建了索引,SQL 却跑成了全表扫描:隐式转换、函数包裹与字符集的“四连暗杀”
一条上线半年都很快的 SQL 突然变慢,EXPLAIN 显示 type=ALL。从慢日志、pt-query-digest 到 EXPLAIN 逐列解读,逐个排查隐式类型转换、函数包裹列、前导 % 与字符集不一致导致索引失效,并给出改法。
从一个关键词,发现新的思路。
一条上线半年都很快的 SQL 突然变慢,EXPLAIN 显示 type=ALL。从慢日志、pt-query-digest 到 EXPLAIN 逐列解读,逐个排查隐式类型转换、函数包裹列、前导 % 与字符集不一致导致索引失效,并给出改法。
线上执行 ALTER TABLE 加字段,结果这张表所有读写全部排队。原因是一个没提交的长事务持有 MDL 读锁,ALTER 等写锁,后续请求全被堵在队列。附 processlist、performance_schema、sys 视图定位与 kill、Online DDL、gh-ost、lock_wait_timeout 的做法。
MyBatis 与 MyBatis-Plus 的实用笔记:#{} 与 ${} 的区别和注入风险、一级二级缓存的坑、批量插入的三种写法对比、分页插件原理、动态 SQL 与常见错误,以及生产慢 SQL 从发现到优化的完整流程。
一份偏实战的 MySQL 笔记:B+ 树索引结构与最左前缀、索引失效的八种写法、MVCC 与四种隔离级别、行锁/间隙锁/死锁的排查命令,以及慢 SQL 从 EXPLAIN 到优化的完整套路,含一次征期高峰死锁的复盘。