Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 24 additions & 2 deletions docs/database/MySQL.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,32 @@ MySQL、PostgreSQL、Oracle、SQL Server、SQLite(微信本地的聊天记录

由于 MySQL 是开源免费并且比较成熟的数据库,因此,MySQL 被大量使用在各种系统中。任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。MySQL 的默认端口号是**3306**。

### 关系型数据库的设计范式?

**范式**是“符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”,可以粗略的理解为**一张数据表的表结构所符合的某种设计标准的级别**。

- **第一范式**(1NF):符合1NF的关系中的每个属性不可再分。另外第一范式是所有关系型数据库的最基本要求。

第一范式的存在的问题:数据冗余过大、插入异常、删除异常、修改异常等问题。

- **第二范式(2NF)**:在符合1NF的基础上,消除了非主属性对于码的部分函数依赖。

第二范式存在的问题: 有可能会出现非主属性对码的传递依赖。

- **第三范式(3NF):** 在符合2NF的基础上,消除了非主属性对码的传递函数依赖。也就是说,如果存在非主属性对于码的传递函数依赖,则不符合第三范式的要求。

第三范式存在的问题:存在着**主属性**对于码的部分函数依赖与传递函数依赖。

- **BC范式(BCNF)**: 在符合3NF 的基础上消除了主属性对码的部分函数依赖和传递函数依赖。

摘自这篇文章[《如何理解关系型数据库的常见设计范式?》](https://www.zhihu.com/question/24696366/answer/29189700)

## 存储引擎

### 存储引擎相关的命令

**查看MySQL提供的所有存储引擎**
=======
**查看 MySQL 提供的所有存储引擎**

```sql
Expand Down Expand Up @@ -152,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 来控制某个查询语句是否需要缓存:**

Expand Down
2 changes: 1 addition & 1 deletion docs/system-design/framework/mybatis/mybatis-interview.md
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ public V get(Object key) {

注:我出的。

答:MyBatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
答:**(1)** MyBatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页;**(2)** 可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能,**(3)** 也可以使用分页插件来完成物理分页。

分页插件的基本原理是使用 MyBatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql,根据 dialect 方言,添加对应的物理分页语句和物理分页参数。

Expand Down
13 changes: 11 additions & 2 deletions docs/system-design/framework/spring/Spring常见问题总结.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 快很多。

Expand Down Expand Up @@ -258,6 +259,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 接口中定义了五个表示隔离级别的常量:**
Expand Down Expand Up @@ -286,6 +291,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和非运行时异常。事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。
Expand Down