Skip to content

Commit 36e2bc4

Browse files
committed
thread
1 parent ff5e60b commit 36e2bc4

File tree

2 files changed

+14
-14
lines changed

2 files changed

+14
-14
lines changed

docs/.vuepress/dist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Subproject commit ed25dda4e371f2c44c7402adc42445074e512e74
1+
Subproject commit ad6ee90be95fa08615671497b33a84874117c823

docs/interview/MySQL-FAQ.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,7 @@ MVCC 的实现是通过保存数据在某个时间点的快照来实现的。也
833833

834834
InnoDB 的 MVCC,是通过在每行记录后面保存两个隐藏的列来实现。这两个列,一个保存了行的创建时间,一个保存行的过期时间(删除时间)。当然存储的并不是真实的时间,而是系统版本号(system version number)。每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。
835835

836-
**REPEATABLE READ(可重读)隔离级别下MVCC如何工作**
836+
**REPEATABLE READ(可重读)隔离级别下 MVCC 如何工作**
837837

838838
- SELECT
839839

@@ -954,7 +954,7 @@ MySQL 从 5.0.3 InnoDB 存储引擎开始支持XA协议的分布式事务。一
954954

955955

956956

957-
## 七、MySQL锁机制
957+
## 七、MySQL 锁机制
958958

959959
> 数据库的乐观锁和悲观锁?
960960
>
@@ -1138,19 +1138,19 @@ SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;
11381138

11391139
**检测死锁**:数据库系统实现了各种死锁检测和死锁超时的机制。InnoDB存储引擎能检测到死锁的循环依赖并立即返回一个错误。
11401140

1141-
**死锁恢复**:死锁发生以后,只有部分或完全回滚其中一个事务,才能打破死锁,InnoDB目前处理死锁的方法是,将持有最少行级排他锁的事务进行回滚。所以事务型应用程序在设计时必须考虑如何处理死锁,多数情况下只需要重新执行因死锁回滚的事务即可。
1141+
**死锁恢复**:死锁发生以后,只有部分或完全回滚其中一个事务,才能打破死锁,**InnoDB 目前处理死锁的方法是,将持有最少行级排他锁的事务进行回滚**。所以事务型应用程序在设计时必须考虑如何处理死锁,多数情况下只需要重新执行因死锁回滚的事务即可。
11421142

11431143
**外部锁的死锁检测**:发生死锁后,InnoDB 一般都能自动检测到,并使一个事务释放锁并回退,另一个事务获得锁,继续完成事务。但在涉及外部锁,或涉及表锁的情况下,InnoDB 并不能完全自动检测到死锁, 这需要通过设置锁等待超时参数 innodb_lock_wait_timeout 来解决
11441144

11451145
**死锁影响性能**:死锁会影响性能而不是会产生严重错误,因为InnoDB会自动检测死锁状况并回滚其中一个受影响的事务。在高并发系统上,当许多线程等待同一个锁时,死锁检测可能导致速度变慢。 有时当发生死锁时,禁用死锁检测(使用innodb_deadlock_detect配置选项)可能会更有效,这时可以依赖`innodb_lock_wait_timeout`设置进行事务回滚。
11461146

11471147

11481148

1149-
**MyISAM避免死锁**
1149+
**MyISAM 避免死锁**
11501150

11511151
- 在自动加锁的情况下,MyISAM 总是一次获得 SQL 语句所需要的全部锁,所以 MyISAM 表不会出现死锁。
11521152

1153-
**InnoDB避免死锁**
1153+
**InnoDB 避免死锁**
11541154

11551155
- 为了在单个InnoDB表上执行多个并发写入操作时避免死锁,可以在事务开始时通过为预期要修改的每个元祖(行)使用`SELECT ... FOR UPDATE`语句来获取必要的锁,即使这些行的更改语句是在之后才执行的。
11561156
- 在事务中,如果要更新记录,应该直接申请足够级别的锁,即排他锁,而不应先申请共享锁、更新时再申请排他锁,因为这时候当用户再申请排他锁时,其他事务可能又已经获得了相同记录的共享锁,从而造成锁冲突,甚至死锁
@@ -1164,7 +1164,7 @@ SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;
11641164

11651165

11661166

1167-
## 八、MySQL调优
1167+
## 八、MySQL 调优
11681168

11691169
> 日常工作中你是怎么优化SQL的?
11701170
>
@@ -1176,7 +1176,7 @@ SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;
11761176
>
11771177
> 什么是最左前缀原则?什么是最左匹配原则?
11781178
1179-
### 影响mysql的性能因素
1179+
### 影响 mysql 的性能因素
11801180

11811181
- 业务需求对MySQL的影响(合适合度)
11821182

@@ -1550,21 +1550,21 @@ select * from B where B.id = A.id`
15501550
- ORDER BY 满足两种情况,会使用 Index 方式排序;
15511551
- ORDER BY 语句使用索引最左前列
15521552
- 使用 where 子句与 ORDER BY 子句条件列组合满足索引最左前列
1553-
- 尽可能在索引列上完成排序操作,遵照索引建的最佳最前缀
1553+
- 尽可能在索引列上完成排序操作,遵照建索引的最左前缀
15541554
- 如果不在索引列上,filesort 有两种算法,mysql 就要启动双路排序和单路排序
1555-
- 双路排序:MySQL 4.1之前是使用双路排序,字面意思就是两次扫描磁盘,最终得到数据
1556-
- 单路排序:从磁盘读取查询需要的所有列,按照order by 列在 buffer对它们进行排序,然后扫描排序后的列表进行输出,效率高于双路排序
1555+
- 双路排序:MySQL 4.1之前是使用双路排序字面意思就是两次扫描磁盘,最终得到数据
1556+
- 单路排序:从磁盘读取查询需要的所有列,按照 order by 列在 buffer 对它们进行排序,然后扫描排序后的列表进行输出,效率高于双路排序
15571557
- 优化策略
15581558

1559-
- 增大sort_buffer_size参数的设置
1560-
- 增大max_lencth_for_sort_data参数的设置
1559+
- 增大 sort_buffer_size 参数的设置
1560+
- 增大 max_lencth_for_sort_data 参数的设置
15611561

15621562

15631563

15641564
**GROUP BY 关键字优化**
15651565

15661566
- group by 实质是先排序后进行分组,遵照索引建的最佳左前缀
1567-
- 当无法使用索引列,增大 `max_length_for_sort_data` 参数的设置,增大`sort_buffer_size`参数的设置
1567+
- 当无法使用索引列,增大 `max_length_for_sort_data` 参数的设置,增大 `sort_buffer_size` 参数的设置
15681568
- where 高于 having,能写在 where 限定的条件就不要去 having 限定了
15691569

15701570

0 commit comments

Comments
 (0)