03.19 Day 60 - 重温 Day 50-54

大家好,我是 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 中、用户自建的是用户临时表,系统自建的是内部临时表。

发布了224 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/stevenchen1989/article/details/104958769