MySQL高级(2) 逻辑架构
文章目录
MySQL逻辑架构
逻辑架构的介绍
连接层
最上层是一些客户端和连接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
服务层
最上层是一些客户端和连接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
引擎层
存储引擎层,存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。常用的存储引擎有MyISAM和InnoDB.
说明
和其他数据库相比, MySQL是插件式的存储引擎架构, 也就是说可以根据应用场景的不同更换存储引擎, 所以MySQL可以在多种不同场景中应用并发挥良好的作用
查看存储引擎
show engines;
查看当前存储引擎
show variables like '%storage_engine%'
MyISAM和InnoDB的区别
MyISAM | InnoDB | |
---|---|---|
主外键(一般不用) | × | √ |
事务 | × | √ |
锁 | 表锁(不适合高并发) | 行锁(适合高并发) |
缓存 | 只缓存索引, 不缓存真实数据 | 索引和真实数据都返回, 对内存要求较高 |
表空间 | 小 | 大 |
关注点 | 性能 | 事务 |
常见的数据库引擎介绍
- MyISAM*
管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎。
- MEMORY
存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样,MEMORY和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。
- InnoDB和BDB
存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里,你可以按照喜好通过配置MySQL来允许或禁止任一引擎。
- EXAMPLE
存储引擎是一个“存根”引擎,它不做什么。你可以用这个引擎创建表,但没有数据被存储于其中或从其中检索。这个引擎的目的是服务,在 MySQL源代码中的一个例子,它演示说明如何开始编写新存储引擎。同样,它的主要兴趣是对开发者。
- NDB Cluster
是被MySQL Cluster用来实现分割到多台计算机上的表的存储引擎。它在MySQL-Max 5.1二进制分发版里提供。这个存储引擎当前只被Linux, Solaris, 和Mac OS X 支持。在未来的MySQL分发版中,我们想要添加其它平台对这个引擎的支持,包括Windows。
- ARCHIVE
存储引擎被用来无索引地,非常小地覆盖存储的大量数据。
- CSV
存储引擎把数据以逗号分隔的格式存储在文本文件中。
- BLACKHOLE
存储引擎接受但不存储数据,并且检索总是返回一个空集。
- FEDERATED
存储引擎把数据存在远程数据库中。在MySQL 5.1中,它只和MySQL一起工作,使用MySQL C Client API。在未来的分发版中,我们想要让它使用其它驱动器或客户端连接方法连接到另外的数据源。
数据存储层
主要是将数据存储在运行于设备的文件系统之上, 并完成与存储引擎的交互
SQL语句的在MySQL架中的执行顺序
- 首先访问连接池
- 访问缓存区读)或缓冲区(写), 如果访问成功(命中), 如果访问失败, 就继续进行下一步(需要在配置文件中启用缓存, 如果没有启用缓存, 将直接对磁盘进行读写)
- SQL接口
- 解析器, 解析SQL语句, 将SQL语序解析成计算机执行的顺序
- 优化器, 在优化器生成执行计划
- 存储引擎开始执行操作
- 更新缓冲区
- 返回执行结果
写SQL语句时的顺序
select distinct <查询列表>
from
<表1> (inner|left|right) join <表2>
on <关联条件>
where <查询条件>
group by <分组条件>
having <having 条件>
order by <排序条件>
limit <范围>
计算机读取SQL的顺序(SQL语句被解析器解析后的顺序)
from <表1>
on <关联条件>
(inner|left|right) join <表2>
where <查询条件>
group by <分组条件>
having <having 条件>
select distinct <查询列表>
order by <排序条件>
limit <范围>