Skip to content

学习笔记《MySql实战45讲》

Posted on:2023年2月6日 at 17:38 (13 min read)

如何写出高性能的 SQL 语句一直是后端开发需要关注的问题,Mysql 实战 45 讲详细介绍了 SQL 执行过程、数据组织方式、事务隔离等核心特性,同时结合答疑篇对具体案例进行详细剖析 如 mysql 如何保证数据完整性、为什么会选错索引等等。

TOC

Open TOC

mysql 分层

server 层和存储引擎层。server 层负责连接,权限校验,词法语法分析等;存储引擎负责数据的存储和提取。 一条查询和更新 SQL 流程如下:

WAL(Write-Ahead Logging 预写日志系统)

Redo log(innodb 特有,保证了 Crash-Safe)

Binlog(归档日志,server 层负责)

索引

锁(按加锁范围分)

ALTER TABLE tbl_name NOWAIT add column ...;
ALTER TABLE tbl_name WAIT N add column ...;

事务隔离(一致性读)

Change buffer(提升更新性能,会定期 merge 和读 merge)

count(*)实现

order by

(Extra 里 using filesort 表示需要排序,使用线程内存(sort_buffer)排序)

Join

应小表驱动大表,但驱动表和被驱动表关系不一定和声明顺序一致

总结

上面总结了 Mysql 45 讲里数据完备性保证、索引失效、锁、Join 过程等的实现和注意事项。 举一个常见的 join 查询来回顾总结下:通常不使用 join 是我们觉得他性能差,但是通过上面 join 实现方式我们可以知道,如果 join 带索引,那么就会走 NLJ 查询,性能比两次查询还要快。而如果带索引的 join 出现慢查时,就需要去查看字段类型、字符集是否一致 导致索引失效。当然如果没有索引的场景,就不建议走 join 连表查询了,因为会走到 BNL 查询。

推荐章节 介绍什么场景不适用读写分离: