1.常见的关系型数据库

MySQL、Oracle、SQLServer、SQLite

1.MySQL架构(如何设计?)

MySQL主要包含两大部分:存储模块、服务模块。
存储模块:负责数据的存储与提取、MySQL中提供了多种存储引擎机制来进行存储。
服务模块:包含连接器、分析器、优化器、执行器、缓存层
MySQL - 图1
1、连接器:进行身份的认证和权限相关(登录MySQL)
2、缓存器:执行SQL语句、先查询缓存中是否存在(8.0之后废除)
3、分析器:没有命中缓存,则对SQL进行分析、检查SQL的合法性
4、优化器:按照MySQL最优方案进行执行
5、知心器:执行SQL语句、执行前会再次判断是否具有响应的权限信息。

2.MySQL存储引擎

MySQL中提供了多种(InnoDB、MyISAM、MEMORY等)存储引擎,最常用的是InnoDB、MyISAM。可以通过show engines命令来进行查看。

1.MySQL存储引擎架构?

MySQL存储引擎采用的是插件式架构,支持多种数据库存储引擎、甚至可以为不同的数据库设置不同的存储引擎。
与此同时、也提供了第三方的一个接口来供开发者进行自行实现。

2.InnoDB&MyISAM

MySQL5.5之前,主要的存储引擎为MyISAM、之后、InnoDB成为了MySQL主要的存储引擎
主要区别:
1、外键:InnoDB支持外键、MyISAM不支持外键设置
2、事务:InnoDB支持事务、MyISAM不支持事务
3、锁:InnoDB支持行锁和表锁、MyISAM只支持表锁。
4、索引:InnoDB支持聚集索引、MyISAM不支持
5、MVCC:InnoDB支持MVCC、MyISAM不支持

4.MySQL三大范式

第一范式:所有的字段都是原子性的、不可拆分的
第二范式:所有的字段全部依赖于主键、不存在部分依赖
第三范式:所有的字段直接依赖主键、不存在间接依赖

5.MySQL执行过程

image.png

2.MySQL事务

MySQL事务的存在,便于开发者保证数据的一致性。

1.ACID特性

MySQL事务中包含ACID四种事务特性、也就是指原子性、一致性、隔离性、持久性
1、A-原子性:事务作为一个整体执行、要么全部成功、要么全部失败。
2、C-一致性:事务执行成功与失败、数据都是完整的、不会出现数据不一致问题
3、I-隔离性:并发事务访问期间、事务之间是相互隔离的、不会相互造成干扰
4、D-持久性:事务完成后,对数据的更改将会持久化到数据库中

2.并发问题

事务并发访问会导致脏读、不可重复读、幻读
image.png
1、脏读:事务A读取了事务B还未提交的数据,造成了脏读。
2、不可重复读:事务A读取了一定条件返回内的数据后,事务B对该范围内的数据进行了修改。此时事务A再次重复读取相同条件范围的数据,造成数据不一致问题。
3、幻读:事务A读取了一定条件返回内的数据后,事务B对该范围内的数据进行了增、删操作。此时事务A再次读取相同条件范围内的数据,造成数据不一致问题。

3.隔离级别

MySQL中提供了四种隔离级别机制:读未提交、读已提交、可重复读、序列化。MySQL中默认为可重复读。
image.png
串行化指的是所有事务都是按照顺序执行的、不会出现任何并发事务问题、隔离级别最高、但耗性能。

4.如何保证事务隔离性?

1.加锁保证隔离

MySQL中不同的隔离级别有不同的实现方式。
序列化采用的加锁实现、其余的均采用MVCC实现。

2.MVCC

3.MySQL锁

MySQL中包含三类锁:行锁&表锁、共享锁&排它锁、意向锁

1.行锁&表锁

MySQL中的InnoDB引擎默认采用的是行锁、同时也支持表锁。但MyISAM只支持表锁。且行锁性能更高、锁冲突更小。
行锁:针对索引字段加锁、WHERE中的字段未命中索引、或者索引失效,都会导致升级为表锁。
不过、很多时候即使走了索引、也还是会进行全表搜索、这是由于MySQL优化器的原因

2.共享锁&排它锁

无论是行锁,还是表锁。都存在共享锁和排它锁机制。
共享锁:也称为读锁、事务并发读取数据时、允许多个事务同时持有锁。
排他锁:也称为写锁、事务并发写如数据时、只能有单个事务占用锁。
注意:只要读锁之间不存在锁冲突问题。

3.意向锁作用

意向锁也是一种表锁,由引擎自动维护、开发者不能操作。意向锁主要用来快速判断添加表锁时、是否存在行锁。

4.MySQL索引

含义:索引是一种用来提高访问速度的、有序的数据结构。
特点:检索快速、但占用内存、维护成本高。

1.索引结构

索引底层具有多种数据结构实现、常见的有B树、B+树、Hash。

1.Hash结构

Hash是一种 数组 + 链表 的键值对集合存储结构。主要通过散列函数来控制数据的存储与读取。
image.png
为何不用Hash做索引?
Hash结构中,采用散列函数来计算数据的存储位置,不能作为索引结构的原因主要有:
1、哈希冲突:Hash表中主要采用Hash函数来计算数据的存储位置,存在哈希冲突问题。
2、查询缺点:Hash表中不能进行排序、范围查询。

2.B树*B+树

B树也称为B-树(多路平衡查找树)。B+树是B树的一种变体。目前大多数数据库都采用B树&B+树做为索引。

3.B&B+树区别

数据存储结构不同:B树所有结点都存储数据、B+树只有叶子结点存储数据(非叶子结点存储索引)。
MySQL - 图6
MySQL - 图7
数据检索效率不同:B树相当于二分查找、B+树只能从根结点开始向叶子结点遍历。
叶子结点不同:B树叶子结点之间无关联关系、B+树叶子结点之间存在引用链指向相邻叶子结点。

2.索引类型

1.主键索引

数据库中的主键使用的就是主键索引。唯一且不能重复、不能为null。没有显示指定主键、则会先判断有无唯一索引、否则会创建一个6Byte的自增索引。
MySQL - 图8

2.二级索引

二级索引又称为辅助索引、是二级索引的叶子结点存储的数据时主键、通过二级索引可以确定主键的位置
唯一索引、普通索引、前缀索引等都属于二级索引。
MySQL - 图9
唯一索引:唯一索引不允许出现重复的值、但可以存在NULL。单表允许创建多个唯一索引。
普通索引:普通索引单纯为了提高查询速度,可以存在重复值&NULL值。
前缀索引:适合于字符串类型的前几个字符创建索引。
全文索引:全文索引为了检索打文本数据的索引。

3.聚集索引&非聚集索引

1.聚集索引

聚集索引:数据和索引存储在一起。主键索引就是聚集索引。
特点:查询快速、B+树中叶子结点有序、很容易定位到数据
缺点:
依赖于有序数据:索引无序时、插入数据前要进行排序。
更新成本高:索引和数据同时存在,数据更新时,维护成本高。

2.非聚集索引

非聚集索引:数据和索引分开存储。二级索引就是非聚集索引。
特点:易维护
缺点:
依赖于有序数据、可能需要二次回表查询

3.非聚集索引回表问题

非聚集索引不一定需要二次回表查询。如果需要查询的字段正好是创建的索引、则会直接返回。也就是指索引覆盖。

4.覆盖索引&联合索引

1.覆盖索引

如果一个索引包含需要查询的字段,则称为覆盖索引。

2.联合索引

多个字段共同创建组合索引。

5.索引创建原则

建立索引:
主键、频繁查询字段、读取占比高的表、尽可能创建组合索引避免冗余索引
不建索引:
可为null的不建、where用不到的不建、频繁修改的不建

6.最左匹配原则

组合索引中、MySQL会根据从左到右的字段顺序依次匹配查询条件。当遇见范围查询时会停止匹配(< > between %开头的like查询等)

7.索引失效

范围查询失效
不符合最左匹配原则失效
字段类型不一致(隐式转换)
索引字段使用函数失效
符号运算失效
or、null、not in like等失效

5.MySQL慢查询日志

1.基本设置

MySQL中默认不开启慢查询日志、需要手动设置参数及其阙值。
然后设置将慢查询日志输出到文件/表结构中。

2.执行计划

explain sql语句
image.png
关键字段解析:
id:SQL语句的执行顺序
select_type:SQL语句的执行类型
table:表名
type:SQL语句查询连接类型,性能逐渐提高
image.png
possible_keys:显示表中可能使用的索引
key:显示SQL执行过程中实际使用的索引
key_len:使用的SQL索引长度、长度越短越好
ref:表示索引的那一列被引用,最好为const

6.MySQL优化

1.MySQL执行过程

image.png

2.优化方面

MySQL优化包含四部分:结构优化、SQL及索引优化、系统配置优化、硬件优化
image.png

3.优化-SQL及索引

1.原则

1、合理建立索引
2、尽量避免全表扫描
3、尽量避免检索无效数据

2.索引

1、合理建立索引
2、避免索引失效

3.SELECT查询优化

1、尽量避免使用in、not in、or、null、<、>、!=等连接词查询,会造成全表扫描
2、尽量避免对索引字段使用函数、隐式转换,造成全表扫描
3、大数据量时,尽量避免使用1=1恒等条件连接
4、避免使用select 查询,以列名代替
5、多表联查时,小表驱动大表

4.优化-结构优化

1、建立索引:优先考虑where条件后的字段
2、数据类型:合理选用数据类型,避免造成空间等的浪费。
3、合理进行分库分表