InnoDB如何引擎通过Next-Key Lock部分解决幻读

1. 幻读问题概述

幻读是数据库并发事务中最棘手的一类问题。它指在同一事务内,连续执行两次相同的查询语句,第二次查询所返回的结果集与第一次查询的结果集不同。具体表现为:新增了符合查询条件的行

示例场景

1
2
3
4
5
6
7
8
9
10
-- 事务A
BEGIN;
SELECT * FROM users WHERE age BETWEEN 20 AND 30;

-- 此时事务B插入了一条新记录
INSERT INTO users (name, age) VALUES ('NewUser', 25);

-- 事务A再次查询
SELECT * FROM users WHERE age BETWEEN 20 AND 30;
-- 发现多了一条记录,即"幻读"
阅读更多

SQL事务隔离级别详解

为什么需要事务隔离级别?

在并发环境下,多个事务同时操作数据库时会产生各种并发问题。如果不进行隔离控制,可能会导致数据的不一致性。主要会出现以下问题:

1. 脏读(Dirty Read)

  • 定义:一个事务读取到另一个事务未提交的数据
  • 危害:可能导致业务决策建立在不可靠的数据之上
阅读更多

MySQL 索引二

索引介绍

索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。

索引的作用就相当于书的目录。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。

索引底层数据结构存在很多种类型,常见的索引结构有: B 树, B+树 和 Hash、红黑树。在 MySQL 中,无论是 Innodb 还是 MyIsam,都使用了 B+树作为索引结构。

索引的优缺点

优点

阅读更多

MySQL通过yum源安装最新版本教程

介绍

截至目前,MYSQL最新的版本为4月23号官方发布的8.0.20版本,本文主要讲解CentOS 8 如何通过yum源安装 最新mysql-community-server-8.0.20版本。

安装官方yum源

官方仓库下载yum源安装包

进入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 查询缓存介绍

MySQL 体系架构如下图所示:

为了提高完全相同的查询语句的响应速度,MySQL Server 会对查询语句进行 Hash 计算得到一个 Hash 值。MySQL Server 不会对 SQL 做任何处理,SQL 必须完全一致 Hash 值才会一样。得到 Hash 值之后,通过该 Hash 值到查询缓存中匹配该查询的结果。

阅读更多

MySQL 锁相关面试题

MySQL锁相关面试题

为什么需要加锁

如果有多个并发请求存取数据,在数据就可能会产生多个事务同时操作同一行数据。如果并发操作不加控制,不加锁的话,就可能写入了不正确的数据,或者导致读取了不正确的数据,破坏了数据的一致性。因此需要考虑加锁。

表级锁和行级锁有什么区别?

MyISAM 仅仅支持表级锁,一锁就锁整张表,这在并发写的情况下性非常差。

阅读更多

MySQL 执行计划分析

什么是执行计划?

执行计划 是指一条 SQL 语句在经过 MySQL 查询优化器 的优化会后,具体的执行方式。

执行计划通常用于 SQL 性能分析、优化等场景。通过 EXPLAIN 的结果,可以了解到如数据表的查询顺序、数据查询操作的操作类型、哪些索引可以被命中、哪些索引实际会命中、每个数据表有多少行记录被查询等信息。

如何获取执行计划?

MySQL 为我们提供了 EXPLAIN 命令,来获取执行计划的相关信息。

阅读更多

MySQL 优化

SQL 语句优化

查询优化

1. Explain 分析

  • 先开启慢查询日志
1
2
set global slow_query_log = on # 开启慢查询日志,默认是关闭的
set global long_qurey_time=0.5 # 设置慢查询时间阈值,单位:秒
阅读更多

MySQL 数据类型

数据类型

整型

TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT 分别使用 8, 16, 24, 32, 64 位存储空间,一般情况下越小的列越好。

INT(11) 中的数字只是规定了交互工具显示字符的个数,对于存储和计算来说是没有意义的。

浮点数

FLOAT 和 DOUBLE 为浮点类型,DECIMAL 为高精度小数类型。CPU 原生支持浮点运算,但是不支持 DECIMAl 类型的计算,因此 DECIMAL 的计算比浮点类型需要更高的代价。

阅读更多

MySQL 索引

定义

索引是对数据库表中一列或者多列的值进行排序的结构。

目的

数据库索引好比一本书的目录,提高查询效率。但是为表设置索引要付出相应的代价:

  • 增加了数据库的存储空间
  • 在插入和修改时需花费更多的时间(因为索引也要随之变动)

分类

1. 聚集索引

索引项的顺序与表中记录的物理顺序一致。对于聚集索引,叶子结点即存储其真实的数据行,不再有另外单独的数据页。

阅读更多