Mysql逻辑架构
从mysql的原理入手,先看一张经典的图:
下面是关于上图的介绍:
1.客户端connectors
与其他编程中的sql语句进行交互,如:java、php;
每个客户端链接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或CPU中运行。服务器会负责缓存线程,因此不需要为每一个新建的连接创建和销毁线程。
一般情况,客户端链接到mysql服务器时,服务器需要对其进下认证,认证基于用户名、原始主机信息和密码。如果使用了安全套接字SSL的方式连接,一旦客户端连接成功,服务器会继续验证该客户端是否具有执行某个特定查询的权限。
2.Management Serveices & Utilities
系统管理和控制工具
3. Connection Pool (连接池)
管理缓存用户连接,线程处理等需要缓存的需求
1、2、3——主要用于连接处理,授权认证,安全等,大多数基于网络的客户端/服务器的工具都有类似的架构
4. SQL Interface (SQL接口)
接受用户的SQL命令,并且返回用户需要查询的结果。
(SQL接口接收到请求后,它会将请求进行hash处理并与缓存中的结果进行对比,如果完全匹配则通过缓存直接返回处理结果)
5. Parser (解析器)
SQL命令传递到解析器的时候,会被解析器解析和验证
主要功能:
1.将sql分解成数据结构,并将这个结构传递到后续步骤,后续的sql的传递和处理就通过这个结构
2.后面分解过程中如果遇到了错误,那么就是这个sql出现了错误,将不会往后继续执行
6. Optimizer (查询优化器)
mysql会解析查询,并创建内部数据结构(解析树),然后进行各种优化,比如:重写查询,决定表的读取顺序,选择合适的索引等。另外使用的是“选取-投影-联接”策略进行查询。
用一个例子就可以理解: select uid,name from user where gender = 1;
这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤
这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤
将这两个查询条件联接起来生成最终查询结果.
*优化器并不关心表使用的是什么存储引擎,但是存储引擎对于优化查询是有影响的,优化器会请求存储引擎提供容量或摸个具体操作的开销信息,以及表数据的统计信息(这里我也没太理解,照抄的)。
7. Cache和Buffer (查询缓存)
如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。
这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等
*对于select语句,在解析查询之前,服务器会先检查查询缓存,如果能够再其中找到对应的查询,服务器将不必再执行查询解析、优化和执行整个过程,而直接返回查询缓存中的结果集。(buffer是写缓存,cache是读缓存)
8.Engine (存储引擎)
存储引擎是MySql中具体的与文件打交道的子系统。也是Mysql最具有特色的一个地方。
Mysql的存储引擎是插件式的。它根据MySql AB公司提供的文件访问层的一个抽象接口来定制一种文件访问机制(这种访问机制就叫存储引擎)
*存储引擎处理完数据,并将其返回给程序的同时,它还会将一份数据保留在缓存中,以便更快速的处理下一次相同的请求。具体情况是,mysql会将查询的语句、执行结果等进行hash,并保留在cache中,等待下次查询。