MySQL逻辑架构
mysql的服务器逻辑机构分为三层:
最上层的服务大多数基于网络的客户端、服务器的工具或者服务都有类似的架构,比如连接处理,授权认证、安全等
第二层架构:mysql的核心服务功能都在这一层,包括查询解析,分析,优化,缓存以及所有的内置函数,所有跨存储引擎的功能都在这一层实现:存储过程,触发器、视图
第三层:包含存储引擎。负责数据的存储和提取,innoDB是个例外,它会解析外键定义,因为mysql服务器本身没有实现该功能
MySQL的查询过程
查询的步骤一般分为六步:
(1)客服端发送一条查询给服务器。
(2)服务器先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果。否则进入下一个阶段。
(3)服务器端进行SQL解析、预处理,在由优化器生成对应的执行计划。
(4)MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询。
(5)将结果返回给客户端。
客户端和服务端的连接
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