MySQL记录锁、间隙锁、临键锁小案例演示

上周我读了一篇关于MySQL锁定机制的文章。
这相当复杂。

间隙锁和钥匙锁。
全部在RR隔离级别下。

唯一索引查询。
目标记录存在。
只需记录锁定即可。
没有间隙锁。

目标记录不存在。
只是一个间隙锁。

范围查询。
没有该条件的记录。
间隙锁。

该状态中存在的记录。
专业钥匙锁。

普通索引查询。
无论是单个项目还是多个项目都没有关系。
所有间隙锁定。

没有索引的查询。
表锁。

间隙锁。
只需锁定相邻区域即可。
禁止插入、修改和删除。
反对幻读。

下一步。
让我们看一个具体的例子。

首先创建一个表。
输入您的数据。

表名称test_db.table。

主键 ID。
唯一索引。

一般索引年龄。

没有索引移动设备。

根据需要插入尽可能多的数据。

首先,让我们看看隐藏的差距。

我不知道如何检查这个。

默认情况下,自动提交处于打开状态。

您可以设置自动提交= 0。

唯一索引。

等价查询。
数据存在。

例如,id=4
仅记录锁。

事务 B。
检查 ID = 5
没有冲突。
请正常检查。

等价查询。
数据不存在。

示例:id = 5
间隙锁定。

交易 B。
插入 ID = 6
您将被阻止。

范围查询。

示例:id > 4 .
Pro Key Lock。

交易 B。
插入 ID = 6
您将被阻止。

一般索引。

等价查询。

例如,年龄= 4
Pro Key Lock。

(1 ,4 ]和(4 ,7 ]。

事务B。
插入id=6 ,age=6
被阻止。

无索引。

查询相等值。

例如,mobile = 8 8 8 8 8 8 4
表锁定。

事务B。
操作无法执行。

范围查询。

例如,mobile > 8 8 8 8 8 8 4
表锁定
无能为力。

如何实现MySQL底层优化:索引的高级最佳实践和维护策略

MySQL 8.0新特性之INTERSECT和EXCEPT

说实话,MySQL8 .0发布了8 .0.3 1 版本,这次给出了真实的信息。
对于集合运算,最终添加了 INTERSECT 和 EXCEPT 两个运算符。

让我们以 INTERSECT 为例。
这东西还是蛮方便的。
如果你想查看2 01 8 年和2 01 9 年被分类为优秀员工的员工列表,在MySQL5 .7 中你需要使用等值内连接。
现在8 .0直接写INTERSECT就可以了,简单多了。
该运算符还支持 ALL 和 DISTINCT 选项。
例如,如果您使用ALL,将为您保留重复的记录;如果使用 DISTINCT,重复记录将被删除。
我尝试了一下,确实比较有效。

除了那里类似。
如果您想知道哪些员工在 2 01 9 年被评为优秀但在 2 01 8 年未被评为优秀,则必须使用左外连接并添加 WHERE 条件。
现在除了直接之外,还支持 ALL 和 DISTINCT。
我进行了测试,发现使用 EXCEPT 比旧方法快得多。

但是,请注意 INTERSECT 的优先级高于 UNION 和 EXCEPT。
这点一定要记住,不然写SQL的时候很容易出错。
官方文档中有详细的介绍,你可以查看一下。

无论如何,这两个新操作符非常强大,并且使管理集合操作变得更加实用。