![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
从根儿上理解MySQL
文章平均质量分 94
本专栏由浅入深的介绍了mysql的原理。对有一定工作经验但对mysql原理了解不够的开发者来说,看完后绝对会对mysql有一个新的认知。
韩朝洋
愿与java共患难
展开
-
mysql中 什么是锁
大家好。上篇文章我们讲了事务并发执行时可能带来的各种问题,今天我们来聊一聊mysql面试必问的问题–锁。原创 2024-06-11 23:42:36 · 1236 阅读 · 2 评论 -
mysql中 事务的隔离级别与MVCC
insert undo 在事务提交之后就可以被释放掉了,而update undo由于还需要支持MVCC,不能立即删除掉。我们知道,一个事务写的一组undo日志中都有一个Undo Log Header部分,这个Undo Log Header中有一个名为TRX_UNDO_HISTORY_NODE的属性,表示一个名为History链表的节点。当一个事务提交之后,就会把这个事务执行过程中产生的这一组update undo日志插入到History链表的头部。原创 2024-06-11 10:43:18 · 1150 阅读 · 0 评论 -
mysql中 undo日志(下)
大家好。上篇文章我们讲了什么是undo日志以及我们日常增删改数据时undo日志是如何产生的,今天我们继续来聊一聊这个undo日志。原创 2024-06-09 23:33:46 · 877 阅读 · 0 评论 -
mysql中 undo日志(上)
大家好。我们知道,事务需要保证原子性,也就是事务中的操作要么全部完成,要么什么也不做。但是我们在开发的过程中肯定都遇到过事务执行到一半就结束,但是事务执行过程中可能已经修改了很多东西的情况,为了保证事务的原子性,这个时候我们就需要把东西改回原先的样子,这个过程称之为回滚(英文名:rollback)。原创 2024-06-08 21:43:48 · 896 阅读 · 0 评论 -
mysql中 redo日志(下)
大家好。上篇文章我们介绍了什么是redo日志以及redo日志的写入过程。建议没看过上篇文章的同学先看一下《mysql那些事儿》之 redo日志(上),今天我们继续来说一说redo日志。原创 2024-06-08 10:24:12 · 750 阅读 · 0 评论 -
mysql中 redo日志(上)
大家好。我们知道InnoDB 存储引擎是以页为单位来管理存储空间的,我们进行的增删改查操作其实本质上都是在访问页面。而在真正访问页面之前,需要把在磁盘上的页缓存到内存中的Buffer Pool之后才可以访问。那么我们思考一个问题:如果我们只在内存的Buffer Pool 中修改了页面,在事务提交后突然发生了某个故障,导致内存中的数据都失效了,这个时候已经提交了的事务对数据库中所做的更改也就跟着丢失了。我们如何才能避免这种情况的发生呢?原创 2024-06-06 21:48:35 · 679 阅读 · 0 评论 -
mysql中事务的简介
大家好。我们在日常开发过程中肯定都或多或少的用到过事务,而且在面试时,数据库的事务也是必问内容之一。今天我们就来说说mysql的事务。为了方便我们下面内容的讲解,我们也先建立一个讲事务必用的表–account表,并在表中插入两条数据。在某个特定的时刻,两个奥特曼在银行所拥有的资产是一个特定的值,这些特定的值也可以被描述为账户在这个特定的时刻现实世界的一个状态。原创 2024-06-06 10:06:12 · 1083 阅读 · 0 评论 -
mysql中InnoDB存储引擎的Buffer Pool
大家好。众所周知,对于使用InnoDB作为存储引擎的表来说,不管是用于存储用户数据的索引(包括聚簇索引和二级索引),还是各种系统数据,都是存储在磁盘上的。在处理客户端的请求时,当需要访问某个页的数据时,就会把完整的页的数据全部加载到内存中。将整个页加载到内存中后就可以进行读写访问了,在进行完读写访问之后mysql并不会把该页对应的内存空间释放掉,而是将其缓存起来,这样将来有请求再次访问该页面时,就可以省去磁盘IO的开销了。原创 2024-06-04 22:58:56 · 1544 阅读 · 0 评论 -
mysql中optimizer trace的作用
我们所说的基于成本的优化主要集中在optimize阶段,对于单表查询来说,我们主要关注optimize阶段 的"rows_estimation"这个过程,这个过程深入分析了对单表查询的各种执行方案的成本;enabled的值改为on后我们就可以输入我们想要查看优化过程的查询语句,当该查询语句执行完成后,就可以到information_schema数据库下的OPTIMIZER_TRACE表中查看完整的优化过程。one_line的值是控制输出格式的,如果为on那么所有输出都将在一行中展示,不适合人阅读。原创 2024-06-04 09:21:49 · 816 阅读 · 0 评论 -
mysql中EXPLAIN详解
大家好。众所周知,MySQL 查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下来具体执行查询的方式。在日常工作过程中,我们可以使用EXPLAIN语句来查看某个查询语句的具体执行计划, 今天我们就来聊一聊EXPLAIN语句。如果我们想看看某个查询的执行计划的话,可以在具体的查询语句前边加一个EXPLAIN,就像这样:下面我们仔细聊一下每个列是干什么的。原创 2024-06-02 22:48:00 · 1243 阅读 · 0 评论 -
mysql中基于规则的优化
大家好。我们在平时开发的过程中可能会写一些执行起来十分耗费性能的语句。当MySQL遇到这种sql时会依据一些规则,竭尽全力的把这个很糟糕的语句转换成某种可以比较高效执行的形式,这个过程被称作查询重写,今天我们就来聊一下mysql在查询重写时遵循的一些比较重要的重写规则。原创 2024-06-02 17:52:17 · 1010 阅读 · 0 评论 -
mysql中子查询的语法和执行过程
大家好。我们在日常开发过程中,肯定都经常用到了子查询。今天我们就来聊一下mysql中子查询的一些语法以及子查询的执行过程。原创 2024-05-30 22:53:55 · 1041 阅读 · 0 评论 -
mysql中InnoDB的统计数据
大家好。我们知道,mysql中存在许多的统计数据,比如通过SHOW TABLE STATUS 可以看到关于表的统计数据,通过SHOW INDEX可以看到关于索引的统计数据,那么这些统计数据是怎么来的呢?它们是以什么方式收集的呢?今天我们来说说InnoDB 存储引擎的统计数据收集策略。原创 2024-05-29 22:50:15 · 1392 阅读 · 0 评论 -
mysql查询请求处理过程
今天和大家分享一下mysql查询请求的处理过程,写的不好的地方多多包涵,话不多说,直接上图!服务器程序在处理客户端发来的请求时,大致分3部分:连接管理、解析优化、存储引擎。接下来详细描述一下3部分做了什么。原创 2024-05-15 10:58:45 · 556 阅读 · 0 评论 -
mysql中InnoDB记录存储结构
大家好,众所周知,InnoDB是一个将表中数据存储到磁盘上的存储引擎。今天就来浅谈一下mysq数据库默认的存储引擎InnoDB是以什么样的形式将数据存放到磁盘上的。平时我们看到的数据库中的数据库都是以一条条记录的形式展示的,例如下图所示。这些记录在磁盘的存放形式也就是本文讲的记录存储结构称之为行格式。在InnoDB存储引擎中有4种不同类型的行格式,分别是COMPACT、REDUNDANT、DINAMIC和COMPRESSED。下面分别讲一下这四个行格式。原创 2024-05-16 11:25:53 · 820 阅读 · 0 评论 -
mysql中InnoDB的数据页的结构
一开始新生成的数据页是没有User Records (用户记录)部分的,当有记录插入时,就会从Free Space(空闲空间)部分申请一部分空间来存储插入的记录,随着插入记录的增多,Free Space(空闲空间)部分的空间会全部被User Records (用户记录)部分替代,这个时候再新插入数据的时候便会新产生一个页。当组中记录超过8条时,会将组拆分成两个组,一个组4条,一个组5条,然后新生成的组会在数据页中的Page Directory部分新增一个槽,用来存放新生成组的最大记录的偏移量。原创 2024-05-17 10:05:19 · 661 阅读 · 0 评论 -
mysql中B+树索引
MyISAM是将索引和数据分开存储:将表中的记录按照记录的插入顺序单独存储在一个文件中,称之为数据文件。这个文件并不划分为若干个 数据页,有多少记录就往这个文件中塞多少记录就成了。我们可以通过行号而快速访问到一条记录。MyISAM在插入数据的时候并没有刻意按照主键大小排序,所以无法使用二分法进行查找记录。使用MyISAM 存储引擎的表会把索引信息另外存储到一个称为索引文件的另一个文件中。在索引的叶子节点中存储的不是完整的用户记录,而是主键值 + 行号的组合。原创 2024-05-18 09:16:28 · 843 阅读 · 0 评论 -
mysql中索引如何在查询执行期间发挥作用
这条sql和上一条sql很像,只是c4查询条件多了个 = ,但就是多的这个 = 让两条sql对应的扫描区间不同,这条sql在查询时,对于 c4 <='a’条件的二级索引记录来说,满足 c5 = ‘a’ 条件的数据可能并没有连续在一起,但是对于c4 ='a’条件的二级索引记录来说,满足 c5 = ‘a’ 条件的数据是连续在一起,所以只要扫描到不符合 c4 =‘a’ 并且 c5 = ‘a’ 条件的记录时,就可以停止扫描,所以这条sql对应的扫描区间就是[(-∞,+∞),(‘a’,‘a’)]。原创 2024-05-18 23:46:15 · 665 阅读 · 0 评论 -
mysql中索引的使用
大家好,我们知道创建索引是要付出时间和空间的代价的,只有合理的创建索引才能提高查询效率。今天我们来聊一聊如何优雅的,合理的使用索引。上篇文章我们讲到了在索引在where查询过程中是如何发挥作用的,今天我们再谈谈索引在排序和分组的时候是如何使用的。为了方便讲解,我们依然建立一个test_table表并创建了一个聚簇索引(id)、三个二级索引(c1、c2、(c4、c5)),其中c4和c5为联合索引。注意:c3列没有创建索引。原创 2024-05-20 09:34:35 · 772 阅读 · 0 评论 -
mysql中mysql的数据目录
大家好,众所周知,mysql中像InnoDB、MyISAM这种存储引擎都是把数据存储到磁盘上,而我们平时常用的操作系统是用文件系统来管理磁盘的。所以我们可以说像InnoDB 、MyISAM这样的存储引擎都是把表存储在文件系统上的。当我们想读取数据的时候,这些存储引擎会从文件系统中把数据读出来返回给我们,当我们想写入数据的时候,这些存储引擎会把这些数据又写回文件系统。那么今天我们就来说一说InnoDB和MyISAM这两个存储引擎的数据如何在文件系统中存储的。原创 2024-05-21 09:42:19 · 765 阅读 · 0 评论 -
mysql中InnoDB的表空间--独立表空间
大家好,上篇文章我们在讲mysql数据目录的时候提到了表空间这个名词,它是一个抽象的概念,对于系统表空间来说,对应着文件系统中一个或多个实际文件;对于每个独立表空间来说,对应着文件系统中一个名为表名.ibd的实际文件。我们可以把表空间比作存储页的容器,当我们想为某个表插入一条记录的时候,就从容器中找出一个对应的页来把数据写进去。今天我们就先来深入聊一下InnoDB的独立表空间。在讲表空间之前,我们先回忆一下页的相关内容,这有助于下面我们对表空间的理解。原创 2024-05-22 00:13:46 · 746 阅读 · 0 评论 -
mysql中InnoDB的表空间--系统表空间
大家好。上篇文章我们讲了InnoDB的独立表空间,我们知道了表空间被划分为许多连续的区,对于大小为16KB的页面来说,每个区默认由64个页组成,每256个区为一组,每个组最开始的几个页的类型是固定的。(在这里强烈建议在看本篇文章之前先看一下上一篇文章)今天我们再来聊一聊–系统表空间。系统表空间的结构和独立表空间基本类似,只不过由于整个MySQL进程只有一个系统表空间,在系统表空间中会额外记录一些有关整个系统信息的页面,所以会比独立表空间多出一些记录这些信息的页面。原创 2024-05-23 10:15:32 · 856 阅读 · 0 评论 -
mysql中单表查询方法
大家好。我们知道,mysql有一个查询优化器的模块。当我们用sql语句查询表中记录时,会对这条查询语句进行语法解析,然后就会交给查询优化器来进行优化,优化后生成一个执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户。今天我们就来介绍一下mysql的单表访问方法。原创 2024-05-23 21:56:00 · 764 阅读 · 0 评论 -
mysql中连接的原理
从本质上来说,连接就是把各个表中的数据取出来进行依次匹配的过程。例如,把t1和t2两个表连接起来的过程就像下图这样:这个过程看起来就是把t1表的记录和t2的记录连起来组成新的更大的记录,所以这个查询过程称之为连接查询。连接查询的结果集中包含一个表中的每一条记录与另一个表中的每一条记录相互匹配的组合,像这样的结果 集就可以称之为笛卡尔积。如果我们乐意,我们可以连接任意数量张表,但是如果没有任何限制条件的话,这些表连接起来产生的笛卡尔积可能是非常巨大的。原创 2024-05-26 14:49:39 · 711 阅读 · 0 评论 -
mysql中单表查询的成本
大家好。我们知道MySQL在执行一个查询时,经常会有多个执行方案,然后从中选取成本最低或者说代价最低的方案去真正的执行查询。今天我们来聊一聊单表查询的成本。那么到底什么是成本呢?我们的表经常使用的MyISAM、InnoDB存储引擎都是将数据和索引都存储到磁盘上的,当我们想查询表中的记录时,需要先把数据或者索引加载到内存中然后再操作。这个从磁盘到内存这个加载的过程损耗的时间称之为I/O 成本。取以及检测记录是否满足对应的搜索条件、对结果集进行排序等这些操作损耗的时间称之为CPU成本。原创 2024-05-27 09:22:24 · 918 阅读 · 0 评论 -
mysql中连接查询的成本
大家好。上篇文章我们讲了mysql中成本的含义以及单表查询如何计算成本。现在我们接着讲讲mysql中连接查询的成本。在讲之前,我们先创建两张一样的表single_table和single_table2,并在表中插入10000条数据。在下面的讲解中,我们称single_table为s1,single_table2为s2。原创 2024-05-27 22:41:30 · 1087 阅读 · 0 评论