概述
MySQL架构
- 连接层:最上层是一些客户端和连接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似tcp/ip的通信。主要完成一些连接处理,授权认证及相关的安全方案。在该层引入了线程池的概念,为通过认证安全接入的客户端提供线程,同样在该层上可以实现基于SSL的安全链接,服务器也会为安全接入的每个客户端验证它具有的操作权限。
- 服务层:第二层架构主要完成核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析哥优化及部分内置函数的执行,所有跨存储引擎的功能也在这一层实现,如过程,函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成优化如确定查询表的顺序,是否利用索引等,最后生成相应的执行操作。如果是select语句,服务器还会查询相应的缓存。如果缓存空间足够大,这样在解决大量读操作的环境中能够很好地提升系统的性能。
- 引擎层:引擎层真正的负责了MySQL中数据的存储和提取,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同。
和其他数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景的应用并发挥良好的作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其他的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需求需要选择合适的存储引擎。
MySQL存储引擎
MySQL常用存储引擎为InnoDB和MyISAM。
查看命令:
#看当前mysql提供什么存储引擎
show ENGINES
#看当前mysql默认存储引擎
show VARIABLES like '%storage_engine';
MyISAM和InnoDB对比
对比项 | MyISAM | InnoDB |
---|---|---|
主外键 | 不支持 | 不支持 |
事务 | 不支持 | 支持 |
行表锁 | 表锁,即使操作一条数据也会锁住整个表,不适合高并发操作 | 行锁,操作时只锁住一行,不对其他行有影响,适合高并发操作 |
缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存所以还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响 |
表空间 | 小 | 大 |
关注点 | 性能 | 事务 |
默认安装 | Y | Y |
MySQL执行加载顺序
手写:
SELECT DISTINCT
<select list>
FROM
<left_table> join <join_type> JOIN <right_table> ON <join_condition>
WHERE
<where_condition>
GROUP BY
<group_by_list>
HAVING
<having_condition>
ORDER BY
<order_by_condition>
LIMIT <limit_number>
机读加载顺序
1. FROM <left_table>
2. ON <join_condition>
3. <join_type> JOIN <right_table>
4. WHERE <where_condition>
5. GROUP BY <group_by_list>
6. HAVING <having_condition>
7. SELECT
8. DISTINCT <select list>
9. ORDER BY <order_by_condition>
10. LIMIT <limit_number>
JOIN
SELECT * FROM EMP;
SELECT * FROM DEP;
七种JOIN理论
内连接(等值连接)
select * from emp e INNER JOIN dep d on e.depId=d.id;
两者均有的部分
左连接(连接左表的全部,右表缺失的字段以null补齐)
select * from emp e LEFT JOIN dep d on e.depId=d.id;
连接左表的全部,如果出现字段缺失用null填充
右连接(连接右表的全部,左表缺失的字段以null补齐)
select * from emp e RIGHT JOIN dep d on e.depId=d.id;
连接右表的全部,如果出现字段缺失用null填充