th3ee9ine

会写一点Java、Go、Python、Vue的后端菜鸡

  • 主页
  • 技术笔记
  • 随笔
所有文章 友链 关于我

th3ee9ine

会写一点Java、Go、Python、Vue的后端菜鸡

  • 主页
  • 技术笔记
  • 随笔

解密MySQL:深入剖析一条SQL语句的执行过程

阅读数:2679次 2023-07-02
字数统计: 7.4k字   |   阅读时长≈ 25分

摘要:通过了解 MySQL 数据库中一条 SQL 语句的执行过程,我们能够更好地理解数据库查询的内部工作原理,并能够优化查询性能和提高数据库操作效率。SQL语句的执行过程,主要有:解析阶段、优化阶段、数据处理阶段。


一、SQL 语句概述

在开始探讨 MySQL 数据库中一条 SQL 语句的执行过程之前,让我们先对 SQL 语句进行简要概述。

SQL(Structured Query Language)是一种用于管理和操作关系型数据库的标准化语言。它提供了一种简洁而强大的方式来查询、插入、更新和删除数据库中的数据。

SQL 语句可以分为以下几个主要类型:

  • 查询语句(SELECT):用于从数据库中检索数据。查询语句可以包括选择特定列、过滤条件、排序和分组等操作。
  • 插入语句(INSERT):用于将新数据插入到数据库表中。插入语句指定了要插入的表和要插入的值。
  • 更新语句(UPDATE):用于修改数据库表中的现有数据。更新语句指定了要更新的表、要更新的列和更新后的值,以及可选的过滤条件。
  • 删除语句(DELETE):用于从数据库表中删除数据。删除语句指定了要删除的表和可选的过滤条件。

除了这些基本的 SQL 语句类型外,还有其他类型的语句,例如用于创建表(CREATE TABLE)、修改表结构(ALTER TABLE)、创建索引(CREATE INDEX)等。

SQL 语句的结构通常由关键字、表名、列名、运算符和值等组成。通过组合这些元素,可以构建出复杂而灵活的查询和操作。

SQL 语句的执行过程涉及多个阶段,包括解析、优化、访问路径选择、执行计划生成、数据获取和数据处理等步骤。理解 SQL 语句的执行过程有助于优化查询性能,提高数据库操作效率。

在接下来的部分,我们将深入探讨 MySQL 数据库中一条 SQL 语句的执行过程,以揭示其内部工作原理并提供优化建议。

二、执行过程概述

在 MySQL 数据库中,一条 SQL 语句的执行过程可以分为多个阶段,每个阶段都有特定的任务和功能。如下图所示:

sql执行过程
sql执行过程

  • 创建连接
  • 查询缓存
  • 解析阶段
  • 优化阶段
  • 数据处理阶段

1、创建连接

客户端想要对数据库进行操作时,前提是与数据库建立好连接;而连接器就是用来负责跟客户端建立连接、获取权限、维持和管理连接的。

2、查询缓存

在解析一个查询语句之前,如果查询缓存是打开的,MySQL会检查这个缓存,是否命中查询缓存中的数据。

MySQL缓存是默认关闭的,也就是说不推荐使用缓存,并且在 MySQL8.0 版本直接将查询缓存的整块功能删掉了。

MySql为什么默认不开启缓存呢?主要是由于它的使用场景限制的:

1、先说下缓存中数据存储格式:key(sql语句)- value(数据值),所以如果SQL语句(key)只要存在一点不同之处就会直接进行数据库查询了。

2、由于表中的数据不是一成不变的,大多数是经常变化的,而当数据库中的数据变化了,那么相应的与此表相关的缓存数据就需要移除掉。

3、解析阶段

解析阶段是执行过程的第一步。在这个阶段,数据库管理系统(DBMS)对 SQL 语句进行解析和验证。这包括词法分析、语法分析和语义分析。

词法分析将 SQL 语句分解成词法单元,语法分析检查语句的语法结构的正确性,语义分析验证表、列和函数等的存在和有效性。

4、优化阶段

优化阶段是为了提高查询性能。在这个阶段,查询优化器分析查询语句并生成查询执行计划。

优化器考虑了多个执行策略和索引选择,通过代价估算器来评估每个执行计划的成本,最终选择最优的执行计划。

5、数据处理阶段

数据处理阶段是执行SQL查询的实际执行阶段。在这个阶段,MySQL根据执行计划从存储引擎中读取数据,并对数据进行过滤、排序、连接和计算等操作。最终,数据处理阶段会生成查询的结果,并将结果返回给客户端。

经过上面的介绍,我们对一条sql语句的执行过程,有了大致的了解了,接下来我们将对每个阶段进行深入的剖析。

三、解析阶段

解析阶段是执行过程中的第一步,它对 SQL 语句进行解析、验证和转换。在解析阶段,数据库管理系统(DBMS)将 SQL 语句转换为内部数据结构,以便后续的处理和执行。以下是对解析阶段的详细解释:

1、词法分析

词法分析(lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。 进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。

词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。

词法分析的核心任务是扫描、识别单词且对识别出的单词给出定性、定长的处理。词法分析程序可以使用 Lex 等工具自动生成。MySQL 并没有使用 Lex 来实现词法分析,而是自己实现了一个词法分析程序,在 sql_lex.cc 源文件中。

词法分析是解析阶段的第一步。在这个步骤中,DBMS 将 SQL 语句分解成一个个称为词法单元的片段,这个片段称之为 Token。

Token 可以是关键字、标识符、运算符、常量或符号等。通过词法分析,DBMS 确定了 SQL 语句的基本构成部分。

其中 Token 中包含 Keyword 和非 Keyword。

例如,SQL语句 select username from userinfo,在分析之后,会得到4个 Token,其中有2个 Keyword,分别为 select 和 from。

Keyword 非Keyword Keyword 非Keyword
select username from userinfo

2、语法分析

语法分析是解析阶段的第二步。在这个步骤中,DBMS 检查 SQL 语句的语法结构的正确性。它使用语法规则和语法树来验证 SQL 语句是否符合语法规范。如果 SQL 语句存在语法错误,DBMS 将生成相应的错误消息。

语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如”程序”,”语句”,”表达式”等等。语法分析程序判断源程序在结构上是否正确。

语法分析程序可以用YACC(BISON)等工具自动生成。MySQL出于于性能和灵活考虑,选择了自己完成词法解析部分,语法规则部分使用 Bison(开源工具)。

词法解析和 Bison 沟通的核心函数是由词法解析器提供的函数接口 yylex(),在 Bison 中,必要的时候调用 yylex() 获得词法解析的数据,完成自己的语法解析。

语法解析调用堆栈,如下图所示:

语法解析调用堆栈

语法分析结束后,会生成一个语法分析树,下图是个简单的例子:

SQL语句:

1
select username, ismale from userinfo where age > 20 and level > 5 and 1 = 1

语法树:

语法树

3、语义分析

语义分析是解析阶段的第三步。在这个步骤中,DBMS 对 SQL 语句进行语义分析,在 语法树 的基础上,对 SQL 语句中的表、列、函数等对象进行验证,并检查数据类型、约束条件和访问权限等。它确保 SQL 语句的语义与数据库中定义的对象和规则一致。

语义分析借助语法树来获取 SQL 语句的结构信息。语法树提供了一个层次结构,其中每个节点存储了语法单元的类型和值,以及它们之间的关系。 语义分析器通过遍历语法树的节点来访问和验证语法单元,如表名、列名、函数名等,并对它们进行相应的语义检查。

语法树提供了结构化的视图,帮助语义分析器理解 SQL 语句的组成部分和关系,从而进行语义验证。通过结合语法树和语义分析,可以确保 SQL 语句的语法正确性和语义一致性。

下面是语义分析的一些重要内容:

  • 对象存在性检查:在语义分析阶段,数据库会检查 SQL 语句中引用的表、列、函数等对象是否存在。如果引用的对象不存在,数据库将生成错误消息并阻止执行语句。这有助于确保 SQL 语句中引用的对象是有效和存在的。
  • 数据类型检查:数据类型检查是语义分析的关键部分。数据库会检查 SQL 语句中的操作数和操作符是否具有兼容的数据类型。例如,对一个字符串列进行数值计算或将字符串值赋给整数列都是不兼容的操作。数据库会根据数据类型检查规则进行验证,并生成适当的错误消息。
  • 约束条件验证:如果 SQL 语句中包含有约束条件,例如主键约束、唯一约束、外键约束等,语义分析器会验证这些约束是否被遵守。例如,在插入数据时,数据库会检查是否违反了唯一约束或外键约束,并生成相应的错误消息。
  • 访问权限控制:语义分析器还负责检查用户对数据库对象的访问权限。它会验证用户是否有足够的权限来执行所请求的操作。如果用户没有足够的权限,数据库将拒绝执行该语句,并生成相应的权限错误消息。

四、优化阶段

优化阶段通常包括两项工作:

  • 逻辑优化
  • 物理优化。

这两项工作都要对语法分析树的形态进行修改。其中,逻辑优化将生成逻辑执行计划。在生成逻辑执行计划过程中,根据关系代数的原理,把语法分析树变为关系代数语法树的样式,原先SQL语义中的一些谓词变化为逻辑代数的操作符等样式,这些样式是一个临时的中间状态,经过进一步的逻辑查询优化,如执行常量传递、选择下推等(如一些节点下移,一些节点上移),从而生成逻辑执行计划。

在生成逻辑查询计划后,查询优化器会进一步对查询树进行物理优化。物理优化会对逻辑进行改造,改造的内容主要是对连接的顺序进行调整。SQL语句确定的连接顺序经过多表连接算法的处理,可能导致表之间的连接顺序发生变化,所以树的形态有可能调整。 物理优化除了进行表的连接顺序调整外,还会使用代价估算模型对单个表的扫描方式、两表连接的连接算法进行评估,选择每一项操作中代价最小的操作为下一步优化的基础。物理优化的最终结果是生成最终物理执行计划。

1、逻辑优化

逻辑优化是MySQL优化器在查询优化过程中的一个重要步骤,它主要涉及对查询的逻辑结构和逻辑操作进行优化。以下是逻辑优化的一些关键点:

  • 查询重写:逻辑优化的一个重要任务是对查询进行重写,以改变查询的逻辑结构和操作顺序,从而提高查询的效率。这可能涉及到条件推导、谓词下推、连接重写等操作,以消除冗余计算、减少数据访问和优化查询的逻辑结构。
  • 条件约束推导:逻辑优化器会尝试推导出更严格的条件约束,以便减少查询的结果集大小。通过分析查询条件和数据关系,它可以推导出额外的条件,从而限制结果集的大小并提高查询效率。
  • 表连接顺序优化:当查询涉及多个表的连接操作时,逻辑优化器会考虑不同的连接顺序,并评估每种连接顺序的成本和效果。它会尝试选择最优的连接顺序,以减少中间结果集的大小和连接操作的复杂性。
  • 子查询优化:逻辑优化器会对查询中的子查询进行优化,以减少子查询的执行次数和成本。它会尽可能将子查询转换为更高效的形式,如将相关子查询转换为连接操作或将非相关子查询转换为派生表。
  • 谓词下推:逻辑优化器会尝试将查询中的谓词(条件)下推到数据源,以减少数据的读取和处理量。它会根据谓词的可下推性和数据源的特性,将谓词下推到尽可能早的位置,以减少不必要的数据访问和处理。
  • 筛选和投影消除:逻辑优化器会分析查询的条件和结果集的需求,并消除不必要的筛选操作和投影操作。通过识别冗余的条件和无效的投影列,它可以减少查询的计算量和数据访问量。

逻辑优化的目标是在 不改变查询结果 的前提下,通过 改进查询的 逻辑结构 和 操作顺序,提高查询的执行效率和性能。通过逻辑优化,MySQL优化器可以生成更高效的执行计划,减少查询的成本和响应时间。

2、物理优化

物理优化是MySQL优化器在查询优化过程中的另一个重要步骤,它涉及到对查询的物理执行计划进行优化。以下是物理优化的一些关键点:

  • 索引选择和优化:物理优化器会分析查询的条件和连接操作,并决定使用哪些索引来加速查询。它会考虑索引的选择性、覆盖度、索引统计信息等因素,以选择最佳的索引策略。物理优化器会根据查询的具体条件和索引的特性,决定是否使用单一索引、多列索引或联合索引等。
  • 数据访问方法选择:物理优化器会根据表的大小、数据分布和查询需求,选择最佳的数据访问方法。它可以选择使用全表扫描、索引扫描、范围扫描、覆盖索引扫描等方法,以尽量减少数据的读取和处理量。
  • 连接操作优化:当查询涉及多个表的连接操作时,物理优化器会选择最佳的连接方法和连接顺序,以减少连接操作的成本。它会评估不同的连接算法(如嵌套循环连接、哈希连接、排序合并连接)和连接顺序,并选择最优的连接方式。
  • 排序和分组优化:物理优化器会优化查询中的排序和分组操作,以提高性能和效率。它可以选择使用排序算法(如快速排序、归并排序)和分组算法(如哈希分组、排序分组),以减少排序和分组操作的成本。
  • 子查询优化:物理优化器会对查询中的子查询进行优化,以减少子查询的执行次数和成本。它会尽可能将子查询转换为更高效的形式,如将相关子查询转换为连接操作或将非相关子查询转换为派生表。
  • 缓存和重用执行计划:物理优化器会尝试从执行计划缓存中查找并重用之前生成的执行计划,以避免重复优化相同的查询。如果查询语句已经在缓存中存在,并且缓存中的执行计划仍然有效,则物理优化器会直接使用缓存中的执行计划,从而节省优化的时间和资源。

物理优化的目标是根据查询的 物理执行环境 和 数据特点,选择 最佳的执行计划 和 操作策略,以最大限度地提高查询的性能和效率。通过物理优化,MySQL优化器能够生成更高效的执行计划,减少查询的成本和响应时间。

3、逻辑优化和物理优化之间的关系

1)逻辑优化为物理优化提供基础

逻辑优化是在查询语句的逻辑层面对查询进行优化,主要涉及对查询的逻辑结构和逻辑操作进行优化。它可以通过查询重写、条件约束推导、连接顺序优化等手段来改进查询的逻辑结构和操作顺序。逻辑优化的结果为物理优化提供了一个更好的查询基础。

2)物理优化是基于逻辑优化的结果

物理优化是在逻辑优化的基础上对查询的物理执行计划进行优化。它主要涉及选择合适的索引、数据访问方法、连接操作方式等,以尽量减少数据的读取和处理量。物理优化器使用逻辑优化的结果作为输入,根据实际数据和执行环境的特征来选择最佳的物理执行计划。

3)逻辑优化和物理优化相互影响

逻辑优化和物理优化是相互依赖和相互影响的过程。逻辑优化的结果可以影响物理优化的选择,而物理优化的选择也可能反过来影响逻辑优化。例如,逻辑优化器在查询重写阶段可能会改变查询的连接顺序,从而影响物理优化器选择连接操作方式和顺序。物理优化器的索引选择和数据访问方法也可能影响逻辑优化器对查询的重写和条件推导。

总的来说,逻辑优化和物理优化是MySQL优化器在查询优化过程中的两个关键环节,它们相互配合、相互影响,共同决定最终的执行计划和查询性能。逻辑优化通过改善查询的逻辑结构和操作顺序为物理优化提供了基础,而物理优化则根据实际数据和执行环境的特征选择最佳的物理执行计划。它们共同协作,以提高查询的执行效率和性能。

五、数据处理阶段

在MySQL的数据处理阶段,具体做了以下几个事情:

  • 数据读取:在数据处理阶段,MySQL会根据查询的执行计划和优化器的选择,通过适当的数据访问方法(如全表扫描、索引扫描、范围扫描等)来读取相关的数据。数据读取的目的是从存储引擎中获取满足查询条件的数据块或行。
  • 数据过滤:一旦数据被读取到内存中,MySQL会应用查询中的条件和过滤规则,对数据进行过滤。这意味着只有满足查询条件的数据行才会被保留下来,而不满足条件的数据将被丢弃。数据过滤是为了减少不必要的数据传输和处理,提高查询的效率。
  • 数据排序和分组:如果查询涉及排序或分组操作,MySQL会根据查询的要求对数据进行排序或分组。它会使用适当的算法(如快速排序、归并排序、哈希分组、排序分组等)来处理数据,并生成排序后的结果或分组后的聚合结果。
  • 数据连接:如果查询涉及多个表的连接操作,MySQL会根据连接的条件和连接算法,将相关的数据行连接在一起。这可能涉及嵌套循环连接、哈希连接、排序合并连接等不同的连接算法,以产生正确的连接结果。
  • 数据投影和计算:在数据处理阶段,MySQL会根据查询的需求对数据进行投影和计算。投影是指根据查询的选择列表,选择需要输出的列,并将其从内存中提取出来。计算是指根据查询中的表达式、函数和运算符,对数据进行计算和转换,以生成最终的查询结果。
  • 数据输出:最后,MySQL将经过处理和计算的数据结果输出给客户端。这可能包括将数据传输到网络缓冲区,格式化数据的展示形式(如文本、JSON、XML等),以及将数据发送给客户端应用程序。

在数据处理阶段,MySQL根据查询的要求对数据进行读取、过滤、排序、连接、计算和输出等操作,以产生最终的查询结果。这一阶段的效率和性能对于整个查询过程的速度和响应时间至关重要。因此,在设计和优化查询时,合理利用索引、优化查询语句和合理配置MySQL的参数等都是关键的步骤。

1、缓存机制

数据库系统通常会使用以下两种缓存机制来提高查询性能和加速数据处理:

  • 数据页缓存(Buffer Pool):在数据处理阶段,主要使用的是数据页缓存(Buffer Pool)这一种缓存机制。数据页缓存是将数据库表的数据块缓存到内存中,以加快数据的读取速度。
  • 查询结果缓存:在文章开头,说到的 查询缓存,指的就是查询结果缓存。

1)数据页缓存(Buffer Pool)

数据页缓存是一种内存缓存机制,用于存储数据库表的数据块。当查询需要读取数据时,系统首先会检查数据页是否在缓存中。如果数据页在缓存中,系统可以直接从内存中获取数据,避免了磁盘访问的开销。这种缓存机制可以显著提高查询性能,特别是对于经常被访问的数据。
数据页缓存的管理是由数据库系统自动完成的。当数据页需要从磁盘加载到内存时,系统会使用一种称为”最近最少使用”(Least Recently Used,LRU)的策略来决定哪些数据页需要被淘汰出缓存,以腾出空间给新的数据页。数据库系统会根据数据的访问模式和频率来优化数据页的加载和淘汰策略。

2)查询结果缓存

查询结果缓存是将完整的查询结果缓存起来的机制,而不仅仅是单个查询语句的结果。当一个查询被执行时,系统会检查查询的结果是否已经在缓存中存在,并且缓存结果可以满足当前的查询需求。如果是,系统可以直接从缓存中返回结果,而无需重新执行查询和计算。这种缓存机制可以减少查询的执行时间,特别是对于复杂查询和计算密集型的操作。

查询结果缓存的使用需要谨慎,因为它占用大量的内存空间,并且对于频繁更新的数据库,缓存的数据可能会过时,需要定期刷新。因此,数据库系统通常提供了配置选项来控制查询结果缓存的大小和过期策略,以适应不同的应用需求。

2、内存排序和过滤

在数据处理阶段,一旦数据页从磁盘加载到内存的数据页缓存(Buffer Pool),数据库系统可以开始执行查询操作。在执行查询之前,可能需要进行内存排序和过滤的操作,这些操作有助于筛选和处理数据,以便返回符合查询条件的最终结果。

1)内存排序(Sorting in Memory)

当查询包含了排序操作(例如使用 ORDER BY 子句)时,数据库系统会尝试在内存中进行排序,以避免繁重的磁盘排序操作。如果排序的数据量不大,可以将数据加载到内存中,并使用快速的排序算法(如快速排序)对数据进行排序。这样可以大大提高排序的速度。

然而,如果查询需要排序的数据量较大,超过了内存缓存的大小,数据库系统可能需要使用外部排序(External Sorting)算法。外部排序可以将大量数据分成适当大小的块,然后在内存中对这些块进行排序,最后将排序后的块写回磁盘,并进行合并排序。外部排序虽然效率较低,但是能够处理大规模的数据排序需求。

注:所以说,在进行sql优化的过程中,可以去除一些不必要的排序条件,以提高sql的执行速度。

2)过滤(Filtering)

在数据处理阶段,过滤是指根据查询条件对数据进行筛选,只保留满足条件的数据行,而过滤掉不符合条件的数据行。过滤操作在执行查询时起着重要的作用,可以帮助缩小数据集,提高查询性能和减少不必要的数据处理。

数据过滤主要发生在以下几个环节:

  • 数据页加载:当数据库系统从磁盘加载数据页到内存的数据页缓存时,可以根据查询条件进行过滤。只有满足条件的数据行才会被加载到内存中,而不符合条件的数据行则被跳过。这样可以避免将不必要的数据加载到内存中,节省了内存资源,并加快数据访问速度。
  • 行扫描:在数据页中,数据库系统会逐行扫描数据并对每一行进行条件判断。只有满足查询条件的数据行才会被保留,而不符合条件的数据行将被过滤掉。这个过程通常发生在执行 WHERE 子句中的条件判断,以确定哪些数据行应该包含在查询结果中。
  • 索引使用:如果查询条件涉及到索引列,数据库系统会使用索引来加速数据过滤。通过索引,系统可以快速定位满足特定条件的数据行,而不需要扫描整个数据表。索引能够减少需要检查的数据行数量,提高过滤效率。

过滤操作在查询的数据处理阶段中起着重要的作用,它可以减少需要处理的数据量,提高查询性能和响应速度。数据库系统会根据查询条件和数据的存储结构,采用合适的过滤策略,通过优化数据过滤过程来提高查询效率。

结尾

通过上面的了解,我们可以对数据库中一条SQL语句的执行过程有了一个较为清晰的认识。从解析阶段到数据处理阶段,每个阶段都扮演着重要的角色,协同工作以实现高效的执行。了解SQL执行过程的内部工作原理,我们能够更好地理解数据库系统的行为,优化查询性能,提高数据库的效率和响应速度。下篇文章我们将深入了解 索引 相关的内容,大家敬请期待。

参考文章

  • MySQL 源码解读之-词法分析
  • MySQL 源码解读之-语法解析(一)
  • 玩转MySQL之六—MySQL查询优化器
  • 本文作者: th3ee9ine
  • 本文链接: https://www.blog.ajie39.top/2023/07/02/解密MySQL:深入剖析一条SQL语句的执行过程/
  • 版权声明: 本博客所有文章除特别声明外,均采用 LICENSE 下的许可协议。转载请注明出处!
  • Mysql
  • Mysql

扫一扫,分享到微信

解密MySQL:索引—优化数据库性能的关键(一)
Git分支规范
© 2019-2023 th3ee9ine
GitHub:hexo-theme-yilia-plus by Litten
本站总访问量2780次 | 本站访客数1558人
  • 所有文章
  • 友链
  • 关于我

tag:

  • 中间件
  • A/B测试
  • 面试
  • 设计模式
  • Git
  • 开发规范
  • go
  • go基础
  • 工程化
  • Jackson
  • 问题总结
  • Java
  • JVM
  • Markdown
  • MyBatis
  • Mybatis
  • ORM
  • Mysql
  • Redis
  • Reactor模型
  • YAML
  • feign
  • rpc
  • git
  • maven
  • 配置
  • linux
  • python
  • 数据可视化
  • redis
  • 协程
  • channel
  • 杂项
  • Hexo
  • github
  • Netty
  • IM
  • WebSocket
  • 测试
  • 开发基础
  • 问题and坑点
  • tools
  • 算法
  • 数据库
  • 推理
  • 博弈
  • Map
  • Java基础
  • 源码分析
  • 微服务
  • RPC
  • HBase
  • Jooq
  • JavaWEB
  • SSM
  • Spring
  • 分布式锁

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 解密MySQL:索引—优化数据库性能的关键(一)

    2023-09-17

    #Mysql

  • 解密MySQL:深入剖析一条SQL语句的执行过程

    2023-07-02

    #Mysql

  • Git分支规范

    2023-05-28

    #Git#开发规范

  • Git多账号配置

    2023-05-28

    #Git#配置

  • 办公软件安装指南

    2022-12-18

    #tools

  • feign坑点总结

    2022-12-18

    #Java#feign#rpc

  • 基于 Netty 实现在线聊天系统(实战篇一)

    2022-07-06

    #Java#Netty#IM

  • 基于 Netty 实现在线聊天系统(原理篇二)

    2022-07-05

    #Java#Netty#IM#WebSocket

  • 基于 Netty 实现在线聊天系统(原理篇一)

    2022-07-03

    #Java#Netty#IM

  • redis 大 key 问题总结(附Go小工具)

    2022-06-22

    #go#问题总结#redis

  • Go 项目结构(草稿)

    2022-06-19

    #go#工程化

  • git——清除所有历史提交记录

    2022-06-19

    #git

  • 逗号 ok 模式与 defer 模式总结

    2022-06-18

    #go#go基础

  • Go 中常见的陷阱与错误

    2022-06-18

    #go#go基础

  • 一个有意思的协程例子

    2022-06-18

    #go#协程#channel

  • Go 协程与通道(channel)

    2022-06-16

    #go#go基础#协程#channel

  • Go 入门总结(三)

    2022-06-12

    #go#go基础

  • Go 入门总结(二)

    2022-05-07

    #go#go基础

  • Go 入门总结(一)

    2022-03-06

    #go

  • git--Fork代码更新与同步

    2022-02-02

    #git

  • 重写TreeMap的比较器(Comparator)引发的问题(源码分析)

    2022-01-16

    #问题总结#Map#Java基础#源码分析

  • Jackson序列化时间类型的数据导致的相关问题

    2021-12-02

    #Jackson#问题总结

  • 算法--排序奇升偶降链表

    2021-11-21

    #面试#算法

  • Java 面试题目总结(非完整版,待补充)

    2021-11-14

    #面试

  • 如何写容易测试的代码(结尾附带单元测试神器推荐)

    2021-10-24

    #测试#开发基础

  • Redis 之从面试题到原理(基础篇)

    2021-06-29

    #面试#Redis

  • 自用开发工具汇总

    2021-06-19

    #杂项

  • Mysql 数据库相关知识点总结

    2021-05-16

    #面试#Mysql

  • Java面试之Hashmap

    2021-05-16

    #面试

  • 数据库基础复习

    2021-05-16

    #面试#Java#数据库

  • Redis 是单线程的???

    2021-05-09

    #Redis#Reactor模型

  • Redis 之从面试题到原理(拓展篇)

    2021-05-05

    #面试#Redis

  • Redis 之从面试题到原理(进阶篇)

    2021-05-05

    #面试#Redis

  • 分布式锁原理分析与应用

    2021-05-05

    #分布式锁

  • YAML的常用语法

    2021-05-05

    #YAML

  • Spring中常用的注解

    2021-05-05

    #Java#Spring

  • python之操作Excel模块

    2021-05-05

    #python

  • python数据可视化

    2021-05-05

    #python#数据可视化

  • python基础

    2021-05-05

    #python

  • ORM之他暂时可能只是个弟弟——Jooq

    2021-05-05

    #Java#ORM#Jooq

  • MyBatis常见面试题总结

    2021-05-05

    #面试#MyBatis

  • Mybatis笔记

    2021-05-05

    #Java#Mybatis#ORM

  • Markdown的常用语法

    2021-05-05

    #Markdown

  • linux深入浅出

    2021-05-05

    #linux

  • Lambda表达式

    2021-05-05

    #Java

  • Java依赖注入详解

    2021-05-05

    #面试

  • Java面试之JVM自动内存管理机制

    2021-05-05

    #面试#Java#JVM

  • java面试之三大特征、六大基本原则

    2021-05-05

    #面试#Java

  • Java基础复习

    2021-05-05

    #面试#Java

  • Java核心技术卷1复习笔记

    2021-05-05

    #面试#Java

  • HBase学习笔记

    2021-05-05

    #HBase

  • GRPC学习笔记

    2021-05-05

    #微服务#RPC

  • Google Java编程风格规范(中文)

    2021-05-05

    #Java

  • flagr入门

    2021-05-05

    #中间件#A/B测试

  • 有趣的海盗分金问题

    2021-05-05

    #推理#博弈

  • 面试题目总结

    2021-05-05

    #面试#Java基础

  • 面试基础题之《volatile》

    2021-05-05

    #面试#Java基础

  • 面试基础题之《面向对象》

    2021-05-05

    #面试#Java基础

  • 美化Blog

    2021-05-05

    #Hexo

  • 利用Hexo和Github搭建Blog(详细版)

    2021-05-05

    #Hexo#github

  • 从零开始学习lambda表达式

    2021-05-05

    #Java

  • 彩笔的一天之面试总结

    2021-05-05

    #面试

  • 如何保证类线程安全

    2021-05-05

    #面试

  • 9种单例模式总结

    2021-05-05

    #面试#设计模式

  • SSM框架整合总结

    2021-05-01

    #JavaWEB#SSM

  • 架构图

    2021-05-01

    #杂项

  • git和maven常用命令

    2020-10-25

    #git#maven

  • 乌班图安装Tools等教程

    2020-10-25

    #杂项

  • 专业术语汇总

    2020-05-31

    #杂项

  • 安装Oracle12C坑点总结

    2019-04-07

    #杂项#问题and坑点

  • 算法竞赛知识点总结(JAVA版)

    2019-04-07

    #算法

  • Pantheon
  • zhuscat
  • threedr3am
教练,我想学技术!
我主要是以后端技术为主,偶尔看看网络安全相关的内容,或者编写一些有趣的脚本!