From 30f8fad19afe4b4224e71d676188f1ef07cd8a0f Mon Sep 17 00:00:00 2001 From: yamonc Date: Fri, 6 Aug 2021 10:19:55 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E8=A1=A5=E5=85=85MySQL=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E5=86=85=E5=AE=B9=EF=BC=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E9=83=A8=E5=88=86=E9=94=99=E5=88=AB=E5=AD=97=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/database/MySQL.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/database/MySQL.md b/docs/database/MySQL.md index 64dfad2f..0190605a 100644 --- a/docs/database/MySQL.md +++ b/docs/database/MySQL.md @@ -144,11 +144,14 @@ MySQL执行以下命令也可以开启查询缓存 set global query_cache_type=1; set global query_cache_size=600000; ``` -如上,**开启查询缓存后在同样的查询条件以及数据情况下,会直接在缓存中返回结果**。这里的查询条件包括查询本身、当前要查询的数据库、客户端协议版本号等一些可能影响结果的信息。因此任何两个查询在任何字符上的不同都会导致缓存不命中。此外,如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL库中的系统表,其查询结果也不会被缓存。 +如上,**开启查询缓存后在同样的查询条件以及数据情况下,会直接在缓存中返回结果**。这里的查询条件包括查询本身、当前要查询的数据库、客户端协议版本号等一些可能影响结果的信息。(**查询缓存不命中的情况:(1)**)因此任何两个查询在任何字符上的不同都会导致缓存不命中。此外,(**查询缓存不命中的情况(2)**)如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL库中的系统表,其查询结果也不会被缓存。 -缓存建立之后,MySQL的查询缓存系统会跟踪查询中涉及的每张表,如果这些表(数据或结构)发生变化,那么和这张表相关的所有缓存数据都将失效。 +(**查询缓存不命中的情况(3)**)缓存建立之后,MySQL的查询缓存系统会跟踪查询中涉及的每张表,如果这些表(数据或结构)发生变化,那么和这张表相关的所有缓存数据都将失效。 + +**使用查询缓存的缺点/为什么MySQL8.0要移除这查询缓存?** **缓存虽然能够提升数据库的查询性能,但是缓存同时也带来了额外的开销,每次查询后都要做一次缓存操作,失效后还要销毁。** 因此,开启缓存查询要谨慎,尤其对于写密集的应用来说更是如此。如果开启,要注意合理控制缓存空间大小,一般来说其大小设置为几十MB比较合适。此外,**还可以通过sql_cache和sql_no_cache来控制某个查询语句是否需要缓存:** + ```sql select sql_no_cache count(*) from usr; ``` @@ -159,7 +162,7 @@ select sql_no_cache count(*) from usr; 事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。 -### 事物的四大特性(ACID) +### 事务的四大特性(ACID) ![事物的特性](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/事务特性.png) From 485242c7947d5b73b25203768a3b921e9fb66e9d Mon Sep 17 00:00:00 2001 From: yamonc Date: Fri, 6 Aug 2021 15:30:32 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E6=9B=B4=E6=96=B0mysql.md=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE=E8=8C=83=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/database/MySQL.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/database/MySQL.md b/docs/database/MySQL.md index 0190605a..d5ab04da 100644 --- a/docs/database/MySQL.md +++ b/docs/database/MySQL.md @@ -55,6 +55,26 @@ ## 常见问题总结 +### 关系型数据库的设计范式? + +**范式**是“符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”,可以粗略的理解为**一张数据表的表结构所符合的某种设计标准的级别**。 + +- **第一范式**(1NF):符合1NF的关系中的每个属性不可再分。另外第一范式是所有关系型数据库的最基本要求。 + + 第一范式的存在的问题:数据冗余过大、插入异常、删除异常、修改异常等问题。 + +- **第二范式(2NF)**:在符合1NF的基础上,消除了非主属性对于码的部分函数依赖。 + + 第二范式存在的问题: 有可能会出现非主属性对码的传递依赖。 + +- **第三范式(3NF):** 在符合2NF的基础上,消除了非主属性对码的传递函数依赖。也就是说,如果存在非主属性对于码的传递函数依赖,则不符合第三范式的要求。 + + 第三范式存在的问题:存在着**主属性**对于码的部分函数依赖与传递函数依赖。 + +- **BC范式(BCNF)**: 在符合3NF 的基础上消除了主属性对码的部分函数依赖和传递函数依赖。 + +摘自这篇文章[《如何理解关系型数据库的常见设计范式?》](https://www.zhihu.com/question/24696366/answer/29189700) + ### 什么是MySQL? MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的。MySQL是开放源代码的,因此任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。MySQL的默认端口号是**3306**。 From c6d832cf37b00933d042caee2f15ff0606cba30f Mon Sep 17 00:00:00 2001 From: yamonc Date: Sat, 7 Aug 2021 10:10:30 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=EF=BC=9Adoc/system-design/frameword/spring/SpringInterviewQues?= =?UTF-8?q?tions.md=20=EF=BC=9Aspring=20AOP=E5=92=8CAspectJ=20AOP=E6=9C=89?= =?UTF-8?q?=E4=BB=80=E4=B9=88=E5=8C=BA=E5=88=AB=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=BA=8F=E5=8F=B7=EF=BC=8C=E6=96=B9=E4=BE=BF=E8=AE=B0=E5=BF=86?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/spring/SpringInterviewQuestions.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/system-design/framework/spring/SpringInterviewQuestions.md b/docs/system-design/framework/spring/SpringInterviewQuestions.md index a0064f6d..ca99b875 100644 --- a/docs/system-design/framework/spring/SpringInterviewQuestions.md +++ b/docs/system-design/framework/spring/SpringInterviewQuestions.md @@ -93,9 +93,10 @@ AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无 ### 4.2 Spring AOP 和 AspectJ AOP 有什么区别? -**Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。** Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。 +1. **Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。** +2. **Spring AOP** 基于**代理(Proxying)**,而 **AspectJ** 基于**字节码操作(Bytecode Manipulation)**。 - Spring AOP 已经集成了 AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单, +3. **Spring AOP** 已经集成了 AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单, 如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择 AspectJ ,它比Spring AOP 快很多。 From cb33610c5dc7a56995f9b73d737b2de0661f2a9a Mon Sep 17 00:00:00 2001 From: yamonc Date: Sat, 7 Aug 2021 10:24:43 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E6=9B=B4=E6=96=B0spring=E4=BA=8B=E5=8A=A1?= =?UTF-8?q?=EF=BC=9A=E6=B7=BB=E5=8A=A0=E7=AE=A1=E7=90=86=E4=BA=8B=E5=8A=A1?= =?UTF-8?q?=E7=9A=84=E6=96=B9=E5=BC=8F=E3=80=81=E4=BA=8B=E5=8A=A1=E4=BC=A0?= =?UTF-8?q?=E6=92=AD=E6=96=B9=E5=BC=8F=E6=80=9D=E7=BB=B4=E5=AF=BC=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/spring/SpringInterviewQuestions.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/system-design/framework/spring/SpringInterviewQuestions.md b/docs/system-design/framework/spring/SpringInterviewQuestions.md index ca99b875..9d637143 100644 --- a/docs/system-design/framework/spring/SpringInterviewQuestions.md +++ b/docs/system-design/framework/spring/SpringInterviewQuestions.md @@ -258,6 +258,10 @@ MVC 是一种设计模式,Spring MVC 是一款很优秀的 MVC 框架。Spring M 1. 基于XML的声明式事务 2. 基于注解的声明式事务 +**思维导图**: + +![image-20210807101442105](https://gitee.com/yamonc/blogImage/raw/master//img/blogImage/image-20210807101442105.png) + ### 8.2 Spring 事务中的隔离级别有哪几种? **TransactionDefinition 接口中定义了五个表示隔离级别的常量:** @@ -286,6 +290,10 @@ MVC 是一种设计模式,Spring MVC 是一款很优秀的 MVC 框架。Spring M - **TransactionDefinition.PROPAGATION_NESTED:** 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。 +**思维导图:** + +![image-20210807102320870](https://gitee.com/yamonc/blogImage/raw/master//img/blogImage/image-20210807102320870.png) + ### 8.4 @Transactional(rollbackFor = Exception.class)注解了解吗? 我们知道:Exception分为运行时异常RuntimeException和非运行时异常。事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。 From 95d5aee9729ca687f6f4c12db6d792d75d8b5272 Mon Sep 17 00:00:00 2001 From: yamonc Date: Sat, 7 Aug 2021 15:27:54 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9MySQL=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/database/MySQL.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/database/MySQL.md b/docs/database/MySQL.md index 13e08377..81e637b8 100644 --- a/docs/database/MySQL.md +++ b/docs/database/MySQL.md @@ -174,9 +174,9 @@ set global query_cache_type=1; set global query_cache_size=600000; ``` -如上,**开启查询缓存后在同样的查询条件以及数据情况下,会直接在缓存中返回结果**。这里的查询条件包括查询本身、当前要查询的数据库、客户端协议版本号等一些可能影响结果的信息。因此任何两个查询在任何字符上的不同都会导致缓存不命中。此外,如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL 库中的系统表,其查询结果也不会被缓存。 +如上,**开启查询缓存后在同样的查询条件以及数据情况下,会直接在缓存中返回结果**。这里的查询条件包括查询本身、当前要查询的数据库、客户端协议版本号等一些可能影响结果的信息。(**查询缓存不命中的情况:(1)**)因此任何两个查询在任何字符上的不同都会导致缓存不命中。此外,(**查询缓存不命中的情况:(2)**)如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL 库中的系统表,其查询结果也不会被缓存。 -缓存建立之后,MySQL 的查询缓存系统会跟踪查询中涉及的每张表,如果这些表(数据或结构)发生变化,那么和这张表相关的所有缓存数据都将失效。 +(**查询缓存不命中的情况:(3)**)**缓存建立之后**,MySQL 的查询缓存系统会跟踪查询中涉及的每张表,如果这些表(数据或结构)发生变化,那么和这张表相关的所有缓存数据都将失效。 **缓存虽然能够提升数据库的查询性能,但是缓存同时也带来了额外的开销,每次查询后都要做一次缓存操作,失效后还要销毁。** 因此,开启查询缓存要谨慎,尤其对于写密集的应用来说更是如此。如果开启,要注意合理控制缓存空间大小,一般来说其大小设置为几十 MB 比较合适。此外,**还可以通过 sql_cache 和 sql_no_cache 来控制某个查询语句是否需要缓存:** From 013b8a0a505f384ef3efaddf79ea3efb3e1766e8 Mon Sep 17 00:00:00 2001 From: yamonc Date: Sun, 8 Aug 2021 09:44:41 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BA=8F=E5=8F=B7?= =?UTF-8?q?=EF=BC=8C=E9=98=85=E8=AF=BB=E8=AE=B0=E5=BF=86=E6=9B=B4=E6=96=B9?= =?UTF-8?q?=E4=BE=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/system-design/framework/mybatis/mybatis-interview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/system-design/framework/mybatis/mybatis-interview.md b/docs/system-design/framework/mybatis/mybatis-interview.md index e1195390..db84dee3 100644 --- a/docs/system-design/framework/mybatis/mybatis-interview.md +++ b/docs/system-design/framework/mybatis/mybatis-interview.md @@ -147,7 +147,7 @@ public V get(Object key) { 注:我出的。 -答:MyBatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页,可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。 +答:**(1)** MyBatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页;**(2)** 可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能,**(3)** 也可以使用分页插件来完成物理分页。 分页插件的基本原理是使用 MyBatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql,根据 dialect 方言,添加对应的物理分页语句和物理分页参数。