一、MySQL的逻辑架构
MySQL的整体逻辑架构如下所示
下面对各个模块进行介绍:
1.连接器(connectors)
一些客户端和连接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限,根据不同语言与SQL的交互。
2.系统管理和控制工具(management services & utilities)
3.连接池(connection pool)
管理缓冲用户连接,线程处理等需要缓存的需求。
负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。
连接线程的主要工作就是负责 MySQL Server 与客户端的通信,接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等。
4.SQL接口(SQL interface)
接受用户的SQL命令,并且返回用户需要查询的结果。
5.解析器(parser)
SQL命令传递到解析器的时候会被解析器验证和解析。
- 将SQL语句进行语义和语法的分析,分解成数据结构,然后按照不同的操作类型进行分类,然后做出针对性的转发到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。
- 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的
6.查询优化器(optimizer)
SQL语句在查询之前会使用查询优化器对查询进行优化。
查询优化器使用的策略是“选取-投影-联接”
例如:select id,name from user where age = 18;
- 该条查询语言先根据where语句进行选取,并不是将所有的数据查询出来再进行过滤;
- 再根据 id,name 进行属性投影,并不是将所有的属性全部提取出来之后进行过滤;
- 最后将两个查询条件联接起来生成最终的查询结果。
7.查询缓存(cache 和 buffer)
主要功能是将客户端提交给MySQL的 select请求的返回结果集 cache 到内存中,与该 query 的一个 hash 值 做一个对应。该 Query 所取数据的基表发生任何数据的变化之后, MySQL 会自动使该 query 的Cache 失效。在读写比例非常高的应用系统中, Query Cache 对性能的提高是非常显著的,当然它对内存的消耗也是非常大的。
如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等。
8.存储引擎(pluggable storage engines)
存储引擎接口模块可以说是 MySQL 数据库中最有特色的一点了。目前各种数据库产品中,基本上只有 MySQL 可以实现其底层数据存储引擎的插件式管理。这个模块实际上只是 一个抽象类,但正是因为它成功地将各种数据处理高度抽象化,才成就了今天 MySQL 可插拔存储引擎的特色。
注意:存储引擎是基于表,而不是数据库。
二、MySQL的简单执行流程
三、存储引擎
MyISAM | 高速引擎,拥有较高的插入,查询速度,但不支持事务、不支持行锁、不支持外键、支持3种不同的存储格式。包含静态型、动态型和压缩型 |
InnoDB | 5.5之后MySQL的默认数据库引擎,支持事务和行级锁,事务处理、回滚、崩溃修复能力和多版本并发控制的事务安全,比MyISAM处理速度稍慢,支持外键。 |
ISAM | MyISAM的前身,5.0以后不再默认安装 |
MRG MyISAM(MERGE) | 将多个表联合成一个表使用,在超大规模数据存储时很有用。 |
Memory | 内存存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。在内存上保存数据,意味着数据很有可能会丢失。 |
Falcon | 一种新的存储引擎,支持事务处理,有可能是innoDB的替代者 |
Archive | 将数据压缩后存储,非常适合存储大量的、独立的,作为历史记录的数据,但是只能进行插入和查询 |
CSV | CSV存储引擎是基于CSV格式文件存储数据(应用于跨平台的数据交换) |
多存储引擎是MySQL区别于其他数据库的一大特性,存储引擎是针对表的;
MySQL5.5之后,默认的存储引擎有MyISAM 变成了 InnoDB。
开发中最多使用的就是InnoDB 和 MyISAM,下面对于这两种引擎进行介绍:
InnoDB | MyISAM | |
存储文件 | .frm 表定义文件 .ibd 数据文件 | .frm 表定义文件 .myd 数据文件 .myi 索引文件 |
锁 | 表锁、行锁 | 表锁 |
事务 | acid | 不支持 |
crud | 读和写多 | 读多 |
count | 扫表 | 有专门存储的地方 |
索引结构 | B + tree | B+tree |