MySQL的逻辑架构

MySQL逻辑架构

mysql的服务器逻辑机构分为三层:

最上层的服务大多数基于网络的客户端、服务器的工具或者服务都有类似的架构,比如连接处理,授权认证、安全等

第二层架构:mysql的核心服务功能都在这一层,包括查询解析,分析,优化,缓存以及所有的内置函数,所有跨存储引擎的功能都在这一层实现:存储过程,触发器、视图

第三层:包含存储引擎。负责数据的存储和提取,innoDB是个例外,它会解析外键定义,因为mysql服务器本身没有实现该功能


MySQL服务器逻辑架构图

MySQL的查询过程

查询的步骤一般分为六步:

(1)客服端发送一条查询给服务器。

(2)服务器先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果。否则进入下一个阶段。

(3)服务器端进行SQL解析、预处理,在由优化器生成对应的执行计划。

(4)MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询。

(5)将结果返回给客户端。

MySQL的一次查询过程查询

客户端和服务端的连接

MySQL客户端/服务端通信协议类似于http1.1协议,都是“半双工”的。半双工传输,即同一时间只有一个一方接受信息或发送信息。所以当客户端传输服务端信息时,服务端不能同时也传输信息给客户端,只能接收客户端的信息。

这里注意,客户端的查询命令过长时要设置max_allowed_packet参数,查询信息超过上限,服务端会抛出用异常。服务端的返回数据分多个数据包传输给客户端直至客户端全部接收,所以也是查询时尽量使用limit和减少使用select * 的一部分原因。

查询缓存

在执行一次查询中,首先会先查询检查查询缓存是否打开,是否命中缓存,命中缓存且用户有查询权限时会立即返回缓存结果。但是命中缓存是很严格的,查询缓存通过一个对大小写敏感的哈希索引查找,注释,空格,版本号等等都会造成缓存没办法命中。

没有命中缓存,会把查询命令传入解析器,解析器会根据SQL命令提取关键字和非关键字,生成一个语法树,在这个过程会检查语法的正确性,比如是否存在关键字,关键字的顺序。进一步会由预处理器来检查语法树,检查数据表和数据列是否存在。

查询优化

经过前面的语法合法性检查,会由查询优化器来生成查询计划,查询优化器会生成多个查询计划,然后执行消耗成本低的查询计划。

比如执行一条 select * from user limit 10; 我们可以用 show status like 'last_query_cost'; 来查看查询的消耗成本。查询结果如下:

+-----------------+-------------+ | Variable_name | Value | +-----------------+-------------+ 

+-----------------+-------------+ | Last_query_cost | 6391.799000 | +-----------------+-------------+

示例中的结果表示优化器认为大概需要做6391个数据页的随机查找才能完成上面的查询。这个结果是根据一些列的统计信息计算得来的,这些统计信息包括:每张表或者索引的页面个数、索引的基数、索引和数据行的长度、索引的分布情况等等。

但是经过查询优化的查询计划并不一定是符合你的最优的查询计划,其中的限制颇多,比如不考虑用户自定义函数,不考虑并发的查询。

存储引擎

存储引擎相对于MySQL有点像Linux系统的文件系统,存储引擎会根据查询计划获取数据的相关信息通过几十个API返回给上层服务器。一般而言存储引擎是不解析处理SQL命令的(InnoDB除外),所以虽然存储引擎各有特点,但是这些差异相对于上层查询的过程是透明的。

InnoDB存储引擎

InnoDB存储引擎一般指新版本的InnoDB plugin,是现在MySQL默认引擎。有一句话是“除非需要用到某些InnoDB不具备的特性,并且没有其他的办法替代,否则都应该优先选择InnoDB引擎”,比如需要使用全文索引,建议先考虑InnoDB+Sphinx的组合而不是使用支持全文索引MyISAM。

InnoDB是基于聚簇索引建立的,对主键查询有很高的性能,支持行级锁,支持事务,支持真正的热备份,采用MVCC(多版本并发控制)来支持高并发,并实现了四个标注的隔离级别。

MyISAM储存引擎

MyISAM是MySQL最早的存储引擎之一,是5.1版本以前的默认存储引擎,有全文索引、压缩、空间函数等特性。但是MyISAM不支持事务和和行级锁,而且有一个严重的缺陷是奔溃后无法安全地恢复。

Archive存储引擎

Archive储存引擎支持行级锁和有专门缓存区,但是只支持insert和select的操作,在5.1版本以前也不支持索引,每次select都需要全表扫描,也不支持事务。

Blackhole储存引擎

Blackhole储存引擎没有任何存储机制,它会丢失所有插入的数据,只适合用来做一些日志审查。

CVS引擎

CVS引擎可以把普通CVS表作为MySQL表处理,但不支持索引。可以转换excel表数据,也可以把数据库表数据转换为CVS文件。

参考资料

《高性能MySQL》第三版

《mysql查询过程》 —— https://www.cnblogs.com/shuaishuai1993/p/9187601.html

你可能感兴趣的:(MySQL的逻辑架构)