MySQL高级(一)(逻辑架构,SQL执行顺序,常见的JOIN查询)

  • 一、MySQL逻辑架构介绍
  • 二、SQL的执行顺序
  • 三、常见的JOIN查询


一、MySQL逻辑架构介绍

MySQL的逻辑架构分四层
1.连接层:
主要完成一些类似连接处理,授权认证及相关的安全方案,在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。
2.服务层:
这是MySQL的核心部分,通常叫做SQLLayer,在MySQL数据库系统处理底层各种数据之前的所有工作都是在这一层完成的,包括权限判断,SQL接口,SQL解析,SQL分析优化等,缓存查询的处理以及部分内置函数执行(如日期,时间,数学运算,加密等)。各个存储引擎提供的功能兜集中在这一层,如存储过程,触发器,试图等等。
3.引擎层:
引擎层是底层数据存取操作实现的部分,由多种存储引擎共同组成,真正负责MySQL中数据的存储和提取。就像Linux众多的文件系统一样。每个存储引擎都有自己的优缺点。服务器是通过存储引擎的API来与它们交互的。这个接口隐藏了各个对存储引擎不同的地方。对于查询层尽可能的透明。这个API包含了很多底层的操作。如开始一个事务,或者取出有特定主键的行。存储引擎不能解析SQL,互相之间也不能通信。仅仅是简单的响应服务器请求。
存储引擎接口模块可以说是MySQL数据库中最有特色的一点。目前各种数据库产品中,基本上只有MySQL可以实现其底层数据存储引擎的插件式管理。这个模块实际上只是一个抽象类,但正是因为他成功的将各种数据处理高度抽象化,才成就了今天MySQL可插拔存储引擎的特色。
MySQL中主要使用的是MyISAM引擎和InnoDB引擎:

对比

MyISAM

InnoDB

主外键

不支持

支持

事务

不支持

支持

行表锁

表锁

行锁

缓存

只缓存索引,不缓存真实数据

不仅缓存索引还要缓存真实数据

表空间



关注点

性能

事务

4.存储层
主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。

二、SQL的执行顺序

手写顺序

SELECT DISTINCT
	<select_list>
FROM
	<left_table> <join_type>
	JOIN<right_table>ON<join_condition>
WHERE 
	<where_condition>
GROUP BY
	<group_by_list>
ORDER BY
	<order_by_condition>
LIMIT <limit_number>

真正的执行顺序:

随着MySQL版本的更新换代,其优化器也在不断升级,优化器会分析不同执行顺序产生的性能消耗不同而动态调整执行顺序。下面是经常出现的查询顺序:

mysql 查询层级 mysql层级关系 sql_mysql

三、常见的JOIN查询

mysql 查询层级 mysql层级关系 sql_mysql 查询层级_02

1.select <select_list> from tableA inner join tableB on a.key = b.key

mysql 查询层级 mysql层级关系 sql_mysql_03

2.select <select_list> from tableA left join tableB on a.key = b.key

mysql 查询层级 mysql层级关系 sql_mysql_04

3.select <select_list> from tableA right join tableB on a.key = b.key

mysql 查询层级 mysql层级关系 sql_MySQL_05

4.select <select_list> from tableA left join tableB on a.key = b.key where b.key is null

mysql 查询层级 mysql层级关系 sql_SQL_06

5.select <select_list> from tableA right join tableB on a.key = b.key where a.key is null

mysql 查询层级 mysql层级关系 sql_mysql 查询层级_07

6.select <select_list> from tableA left join tableB on a.key = b.key
union #将两个查询结果合并会删除重复的数据
select <select_list> from tableA right join tableB on a.key = b.key

mysql 查询层级 mysql层级关系 sql_mysql_08

select <select_list> form tableA left join tableB on a.key = b.key where b.key is null
union
select <select_list> from tableA right join tableB on a.key = b.key where a.key is null