InnoDB如何引擎通过Next-Key Lock部分解决幻读
1. 幻读问题概述
幻读是数据库并发事务中最棘手的一类问题。它指在同一事务内,连续执行两次相同的查询语句,第二次查询所返回的结果集与第一次查询的结果集不同。具体表现为:新增了符合查询条件的行。
示例场景
1 | -- 事务A |
InnoDB如何引擎通过Next-Key Lock部分解决幻读
幻读是数据库并发事务中最棘手的一类问题。它指在同一事务内,连续执行两次相同的查询语句,第二次查询所返回的结果集与第一次查询的结果集不同。具体表现为:新增了符合查询条件的行。
1 | -- 事务A |
在并发环境下,多个事务同时操作数据库时会产生各种并发问题。如果不进行隔离控制,可能会导致数据的不一致性。主要会出现以下问题:
索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。
索引的作用就相当于书的目录。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。
索引底层数据结构存在很多种类型,常见的索引结构有: B 树, B+树 和 Hash、红黑树。在 MySQL 中,无论是 Innodb 还是 MyIsam,都使用了 B+树作为索引结构。
优点:
截至目前,MYSQL最新的版本为4月23号官方发布的8.0.20
版本,本文主要讲解CentOS 8 如何通过yum源安装 最新mysql-community-server-8.0.20
版本。
进入MySQL官方仓库^1, 在首页,最近的新版本仓库源安装包都会在这里,如果你对自己的系统了解,你可以直接找到自己Linux平台对应的官方源安装包直接安装。MySQL官方分别管理了yum源和apt源,进入里面,你就可以看到各个MySQL版本的安装包了。我的Linux为CentOS 8.1
, arch为 x86_64
,进到对应目录 https://repo.mysql.com/yum/mysql-8.0-community/el/8/x86_64/
,在这里,看到各种MySQL相关的安装包,其中的mysql80-community-release
字样的就是官方yum源的安装包,在首页也能找到,因为是CentOS8系统,直接首页浏览器搜索el8字样,就能看到一样的yum源安装包,最新的是mysql80。
MySQL 体系架构如下图所示:
为了提高完全相同的查询语句的响应速度,MySQL Server 会对查询语句进行 Hash 计算得到一个 Hash 值。MySQL Server 不会对 SQL 做任何处理,SQL 必须完全一致 Hash 值才会一样。得到 Hash 值之后,通过该 Hash 值到查询缓存中匹配该查询的结果。
如果有多个并发请求存取数据,在数据就可能会产生多个事务同时操作同一行数据。如果并发操作不加控制,不加锁的话,就可能写入了不正确的数据,或者导致读取了不正确的数据,破坏了数据的一致性。因此需要考虑加锁。
MyISAM 仅仅支持表级锁,一锁就锁整张表,这在并发写的情况下性非常差。
执行计划 是指一条 SQL 语句在经过 MySQL 查询优化器 的优化会后,具体的执行方式。
执行计划通常用于 SQL 性能分析、优化等场景。通过 EXPLAIN
的结果,可以了解到如数据表的查询顺序、数据查询操作的操作类型、哪些索引可以被命中、哪些索引实际会命中、每个数据表有多少行记录被查询等信息。
MySQL 为我们提供了 EXPLAIN
命令,来获取执行计划的相关信息。
1 | set global slow_query_log = on # 开启慢查询日志,默认是关闭的 |
TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT 分别使用 8, 16, 24, 32, 64 位存储空间,一般情况下越小的列越好。
INT(11) 中的数字只是规定了交互工具显示字符的个数,对于存储和计算来说是没有意义的。
FLOAT 和 DOUBLE 为浮点类型,DECIMAL 为高精度小数类型。CPU 原生支持浮点运算,但是不支持 DECIMAl 类型的计算,因此 DECIMAL 的计算比浮点类型需要更高的代价。