11# MySQL面试
22
3- > 参考:https://juejin.cn/post/6850037271233331208#comment
4- >
5- > sql解析:https://juejin.cn/post/6850037271233331208#heading-52
63
7- ### 基础架构
4+ ## 基础架构
85
96> 由外向里,逐步深入
107
1512
1613
1714
18- ### 存储引擎
15+ ## 存储引擎
1916
2017- InnoDB 【MySQL 默认的存储引擎,支持** 事务、行级锁定和外键** 】
2118- MyISAM【** 不支持事务,不支持外键** 】
2926
3027
3128
32- #### 查看存储引擎
29+ ### 查看存储引擎
3330
3431``` bash
3532-- 查看支持的存储引擎
@@ -55,7 +52,7 @@ show table status from database where name="tablename"
5552
5653
5754
58- ### 数据类型
55+ ## 数据类型
5956
6057- 整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT
6158- 浮点数类型:FLOAT、DOUBLE、DECIMAL
@@ -71,31 +68,29 @@ show table status from database where name="tablename"
7168
7269
7370
74- ### 索引(单独重点来)
71+ ## 索引(单独重点来)
7572
7673> 索引(Index)是帮助MySQL高效获取数据的数据结构,所以说** 索引的本质是:数据结构**
7774
7875索引本身也很大,不可能全部存储在内存中,** 一般以索引文件的形式存储在磁盘上**
7976
80- ##### 优点
81-
77+ 优点:
8278- ** 提高数据检索效率,降低数据库IO成本**
8379- ** 降低数据排序的成本,降低CPU的消耗**
8480
85- ##### 缺点
86-
81+ 缺点:
8782- 索引也是一张表,保存了主键和索引字段,并指向实体表的记录,所以也需要占用内存
8883- 虽然索引大大提高了查询速度,同时却会降低更新表的速度,【更新表的时候需要更新索引】
8984
9085
9186
9287
9388
94- ### 事务
89+ ## 事务
9590
9691> 主要用于处理操作量大,复杂度高的数据
9792
98- #### 基本要素(ACID)
93+ ### 基本要素(ACID)
9994
10095- ** A (Atomicity) 原子性** :整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样
10196- ** C (Consistency) 一致性** :在事务开始之前和事务结束以后,数据库的** 完整性约束** 没有被破坏
@@ -121,7 +116,7 @@ show table status from database where name="tablename"
121116 - 一种是加锁:在读取数据前,对其加锁,阻止其他事务对数据进行修改。
122117 - 另一种是数据多版本并发控制(MultiVersion Concurrency Control,简称 ** MVCC** 或 MCC),也称为多版本数据库:不用加任何锁, 通过一定机制生成一个数据** 请求时间点** 的一致性数据快照 (Snapshot), 并用这个快照来提供一定级别 (语句级或事务级) 的一致性读取。从用户的角度来看,好象是数据库可以提供同一数据的多个版本。
123118
124- ### 事务隔离级别
119+ ## 事务隔离级别
125120
126121数据库事务的隔离级别有4种,由低到高分别为
127122
@@ -165,7 +160,7 @@ show table status from database where name="tablename"
165160
166161
167162
168- #### MVCC 多版本并发控制
163+ ### MVCC 多版本并发控制
169164
170165- ** 乐观(optimistic)并发控制**
171166- ** 悲观(pressimistic)并发控制**
@@ -188,7 +183,7 @@ MVCC 是行级锁的一个变种,但它在很多情况下避免了加锁操作
188183
189184
190185
191- ### 事务的实现
186+ ## 事务的实现
192187
193188> 事务的实现就是如何实现ACID特性
194189
@@ -199,7 +194,7 @@ MVCC 是行级锁的一个变种,但它在很多情况下避免了加锁操作
199194- ** redo log(重做日志** ) 实现持久化和原子性
200195- ** undo log(回滚日志)** 实现一致性
201196
202- ##### MySQL日志分类
197+ ### MySQL日志分类
203198
204199> 参考:https://www.cnblogs.com/myseries/p/10728533.html
205200
@@ -236,11 +231,11 @@ general log 普通日志
236231 作用:记录数据库操作明细,默认关闭,开启会降低数据库性能
237232```
238233
239- ### MySQL锁机制
234+ ## MySQL锁机制
240235
241236> 锁是计算机协调多个进程或线程并发访问某一资源的机制,是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则
242237
243- #### 锁的分类
238+ ### 锁的分类
244239
245240** 从对数据操作的类型分类** :
246241
@@ -268,7 +263,7 @@ general log 普通日志
268263| InnoDB | √ | √ | |
269264| Memory | | √ | |
270265
271- ### MyISAM 表锁
266+ ## MyISAM 表锁
272267
273268MyISAM 的表锁有两种模式:
274269
@@ -279,7 +274,7 @@ MyISAM 的表锁有两种模式:
279274
280275默认情况下,写锁比读锁具有更高的优先级:当一个锁释放时,这个锁会优先给写锁队列中等候的获取锁请求,然后再给读锁队列中等候的获取锁请求。
281276
282- ### InnoDB 行锁
277+ ## InnoDB 行锁
283278
284279InnoDB 实现了以下两种类型的** 行锁** :
285280
@@ -293,7 +288,7 @@ InnoDB 实现了以下两种类型的**行锁**:
293288
294289** 索引失效会导致行锁变表锁** 。比如 vchar 查询不写单引号的情况。
295290
296- #### 加锁机制
291+ ### 加锁机制
297292
298293** 乐观锁与悲观锁是两种并发控制的思想,可用于解决丢失更新问题**
299294
@@ -305,7 +300,7 @@ InnoDB 实现了以下两种类型的**行锁**:
305300
306301
307302
308- #### 锁模式(InnoDB有三种行锁的算法)
303+ ### 锁模式(InnoDB有三种行锁的算法)
309304
310305- ** 记录锁(Record Locks)**
311306- ** 间隙锁(Gap Locks)**
@@ -347,7 +342,7 @@ InnoDB这种行锁实现特点意味着:**只有通过索引条件检索数据
347342
348343
349344
350- #### 死锁
345+ ### 死锁
351346
352347** 死锁产生** :
353348
@@ -379,7 +374,7 @@ InnoDB这种行锁实现特点意味着:**只有通过索引条件检索数据
379374
380375
381376
382- ### MySQL分区
377+ ## 分区
383378
384379一般情况下我们创建的表对应一组存储文件,使用` MyISAM ` 存储引擎时是一个` .MYI ` 和` .MYD ` 文件,使用` Innodb ` 存储引擎时是一个` .ibd ` 和` .frm ` (表结构)文件。
385380
@@ -410,7 +405,7 @@ hash 分发,好处在于说,可以平均分配每个库的数据量和请求
410405
411406
412407
413- ### MySQL分表
408+ ## 分表
414409
415410** 垂直拆分**
416411
@@ -433,7 +428,7 @@ hash 分发,好处在于说,可以平均分配每个库的数据量和请求
433428
434429
435430
436- ### MySQL分库
431+ ## 分库
437432
438433> 为什么要分库?
439434
@@ -454,15 +449,15 @@ hash 分发,好处在于说,可以平均分配每个库的数据量和请求
454449
455450
456451
457- ### 主从复制
452+ ## 主从复制
458453
459454- master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events;
460455
461456- salve 将 master 的 binary log events 拷贝到它的中继日志(relay log);
462457
463458- slave 重做中继日志中的事件,将改变应用到自己的数据库中。** MySQL 复制是异步且是串行化的。**
464459
465- #### 复制的基本原则
460+ ### 复制的基本原则
466461
467462- 每个 slave只有一个 master
468463- 每个 salve只能有一个唯一的服务器 ID【mysql_id唯一性】
@@ -472,15 +467,15 @@ hash 分发,好处在于说,可以平均分配每个库的数据量和请求
472467
473468
474469
475- ### 三个范式
470+ ## 三个范式
476471
477472- 第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
478473- 第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
479474- 第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如 果存在"A → B → C"的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系: 关键字段 → 非关键字段 x → 非关键字段y
480475
481476
482477
483- ### 百万级别或以上的数据如何删除
478+ ## 百万级别或以上的数据如何删除
484479
485480关于索引:由于** 索引需要额外的维护成本** ,因为** 索引文件是单独存在的文件** ,所以当我们对数据的增加,修改,删除,都会产生额外的对索引文件的操作,这些操作需要消耗额外的IO,会降低增/改/删的执行效率。所以,在我们删除数据库百万级别数据的时候,查询MySQL官方手册得知删除数据的速度和创建的索引数量是成正比的。
486481
@@ -489,7 +484,11 @@ hash 分发,好处在于说,可以平均分配每个库的数据量和请求
4894843 . 删除完成后重新创建索引(此时数据较少了)创建索引也非常快,约十分钟左右。
4904854 . 与之前的直接删除绝对是要快速很多,更别说万一删除中断,一切删除会回滚。那更是坑了
491486
487+ ** 先删除索引--->再删除无用数据----> 对留下来的数据重新简历索引,避免索引丢失**
492488
489+ ## 参考资料
493490
494- ** 先删除索引--->再删除无用数据----> 对留下来的数据重新简历索引,避免索引丢失**
491+ - < https://juejin.cn/post/6850037271233331208#comment >
492+
493+ - < https://juejin.cn/post/6850037271233331208#heading-52 >
495494
0 commit comments