大家好,我是 Snow Hide,作为《MySQL 实战》这个专栏的学员之一,这是我打卡的第 60 天,也是我第 122 次进行这种操作。
今天我温习了该专栏里叫《到底可不可以使用join?》、《join语句怎么优化?》、《什么时候会使用内部临时表?》、《insert语句的锁为什么这么多?》、《grant之后要跟着flush privileges吗?》、《为什么临时表可以重名?》的文章。
关键词总结:两类 join 语句使用问题、Index Nested-Loop Join、Simple Nested-Loop Join、Block Nested-Loop Join、Multi-Range Read 优化、Batched Key Access、BNL 算法的性能问题、BNL 转 BKA、扩展 hash join、union 执行流程(union 语句的 explain 结果、union 语句的执行流程)、group by 执行流程(group by 语句的 explain 三个信息、group by 语句的 explain 结果)、group by 优化方法 – 索引(MySQL 5.7 版本支持的 generated column 机制、优化后的 group by 语句的 explain 结果)、group by 优化方法 – 直接排序(group by 语句中加入 SQL_BIG_RESULT 提示、加入提示后语句的执行流程、MySQL 使用临时表的场景)、insert … select 语句(可重复读隔离级别下 binlog_format 为 statement 时执行插入操作时需要对表的所有行和间隙加锁)、insert 循环写入(循环插入语句执行过程、用临时表做优化)、insert 唯一键冲突(会话一执行回滚时会话三几乎同时发现死锁并返回的逻辑)、insert into … on duplicate key update(该语句的语义逻辑)、创建用户命令的两个动作、全局权限(grant 命令的两个动作、grant 命令的分析结果、回收 grant 语句赋予的权限、revoke 命令的两个动作)、db 权限(库级别 grant 命令的两个动作)、表权限和列权限(两类权限的赋予命令、不需要执行 flush privileges 命令的场景)、flush privileges 使用场景(删除用户后内存数据还存在的结果)、内存表和临时表的区别、临时表的特性(临时表在使用上的几个特点、临时表适合 join 优化场景的原因)、临时表的应用(两种比较常用的思路)、为什么临时表可以重用?(表中数据的存放方式在不同 MySQL 版本中的不同处理方式、MySQL 维护数据表时包含物理文件和内存里的表)、临时表和主备复制(MySQL 记录 binlog 时将主库执行语句的线程编号写到 binlog 中)。
所学总结:
join 语句
两类 join 语句使用问题
Index Nested-Loop Join
Simple Nested-Loop Join
Block Nested-Loop Join
Multi-Range Read 优化
Batched Key Access
BNL 算法的性能问题
BNL 转 BKA
扩展 hash join
group by 算法
union 执行流程
union 语句的 explain 结果
union 语句的执行流程
group by 执行流程
group by 语句的 explain 三个信息
group by 语句的 explain 结果
group by 优化方法 – 索引
MySQL 5.7 版本支持的 generated column 机制
优化后的 group by 语句的 explain 结果
group by 优化方法 – 直接排序
group by 语句中加入 SQL_BIG_RESULT 提示
加入提示后语句的执行流程
MYSQL 使用临时表的场景
insert 语句
insert … select 语句
可重复读隔离级别下 binlog_format 为 statement 时执行插入操作时需要对表的所有行和间隙加锁
insert 循环写入
循环插入语句执行过程
用临时表做优化
grant 和 flush privileges 语句
临时表
末了
重新总结了一下文中提到的内容:MySQL 执行 join 语句的两种可能算法、join 语句的性能取决于能否用上被驱动表的索引、BKA 优化是 MySQL 内置的、BNL 算法效率低、基于临时表的改进方案、配合应用端模拟出 hash join、没有排序要求的 group by 语句可以在末尾加 order by null、group by 过程用表索引以确保 explain 结果没有 Using temporary 及 Using filesort、group by 统计数据不大时只用内存临时表或适当调大 tmp_table_size 参数以避免用到磁盘临时表、统计数据太大时用 SQL_BIG_RESULT 提示告诉优化器使用排序算法得到 group by 语句的结果、insert … select 是很常见的在两表之间拷贝数据的方法、insert 和 select 的对象是同一个表时可能会造成循环写入、insert 语句如果出现唯一键冲突,会在冲突的唯一值上加共享的 next-key lock、MySQL 用户权限在数据表和内存中的存在形式、grant 和 revoke 命令的执行逻辑、规范地使用 grant 和 revoke 语句时不需要后跟 flush privileges 语句、flush privileges 语句本身会用数据表的数据重建一份内存权限数据、临时表一般用于处理比较复杂的计算逻辑、在 binlog_format=‘row’ 时临时表的操作不记录到 binlog 中、用户自建的是用户临时表,系统自建的是内部临时表。