MySQL几种连接(Join)关系
前言
- MySQL逻辑架构图
![](https://i-blog.csdnimg.cn/blog_migrate/b986d303cc7f00cf9c5d0814b38b7a0b.png)
-
MySQL逻辑图顺序如下:
- 1, 连接层
- 2, 服务层
- 3, 引擎层
- 4, 存储层
-
逻辑架分层各个组件介绍
- 1, 连接层: 连接层为关联上层编程语言操作SQL提供支持
- 2, 服务层:
- SQL InterFace: 为执行SQL提供接口,
- Parser: SQL解析器
- Optimizer: 执行优化器,负责优化Client端的SQL
- Caches&Buffers: 数据缓存层
- 3, 执行引擎层: 为SQL的执行提供支持
- 4, 存储层: 提供硬件数据存储支持工作
第一章 SQL执行顺序
1.1, 手写SQL顺序
1.2, 数据库执行SQL顺序
1.3, 主流存储引擎比较
1.4, SQL执行慢原因
- SQL语句有问题
- 索引失效
- 单值索引
- 复合索引
- 关联查询太多
- 数据库配置问题
- 硬件问题
- 磁盘已满
第二章 JOIN关系
2.1 七种Join关系示意图
- 内连接
- 左连接
- 右连接
- 全连接
- 左连接不需要右表数据的
- 右连接不需要左表数据的
第三章 索引
3.1 索引是什么?
第四章 Explain性能分析
4.0 Explain能干嘛?
- 分析表的读取顺序
![image-20211013235031681](https://i-blog.csdnimg.cn/blog_migrate/3c282bdfef71dbcc5f36802b9706cdad.png)
4.1 Explain的几种类型含义
-
ID: 代表SQL执行的顺序即数据表的加载顺序,分为三种情况
- ID相同的情况下,执行顺序由上到下顺序执行
- ID不同的情况下
- 如果是子查询,ID越大越先执行
- ID相同又不同的情况下,
- ID越大越先执行,相同ID从上到下顺序执行
-
select_type: 代表查询类型
- 作用: 主要用于区别普通查询 联合查询 子查询等复杂查询类型
- SIMPLE:简单的select查询,查询中不包含子查询或者UNION
- PRIMARY:查询中若包含任何复杂的子部分,最外层查询则被标记为
- SUBQUERY:在SELECT或WHERE列表中包含了子查询
- DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生)MYSQL会递归执行这些子查询,把结果放在临时表里
- UNION:若第二个SELECT出现在UNION之后,则被标记为UNION若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED
- UNION RESULT:从UNION表获取结果的SELECT
- 作用: 主要用于区别普通查询 联合查询 子查询等复杂查询类型
-
table: 代表这一行数据是来自哪张表的
-
type: 访问类型(即SQL中的查询有没有用到索引)
- all<index<range<ref<eq_ref<const<system
- ALL: 代表全表扫描,未用到索引
- INDEX: 代表用到索引,索引扫描
- Range: 代表用到索引,索引范围扫描, 一般出现在where后面的范围查询SQL中
- Ref: 非唯一性索引扫描,会返回多行与之匹配的数据,但仍用到了索引
- Eq_Ref: 唯一性索引扫描,表示对于每个索引键表中只有一条记录与之匹配,常见于主键索引或唯一索引
- Const: 表示通过索引一次就找到了数据,出现在主键索引或唯一索引中
- System: 代表表中只有一行记录,即只有系统表中才会出现,Const的特例