要深入了解MySQL,需要先窥其全貌,了解MySQL的架构是如何组成的,我们在执行一条SQL时都发生了什么。
上图是MySQL基本逻辑架构
下面分别看看架构中的各个组件分别起什么作用。
我们常说的安装MySQL是指安装MySQL服务端部分,也就是图中的Server和执行引擎部分,而我们常用的Navicat,命令行执行MySQL工具,各个语言的连接驱动等,都是客户端。
连接器负责跟客户端建立连接,获取权限,维持和管理连接。
Access denied for user
的错误。show processlist
命令可以看到 在8.0以前的版本,MySQL是有查询缓存的。当MySQL执行完一个查询语句,会将执行结果以key-value的形式缓存到内存中,这里的key就是查询用的SQL语句,如果正在执行的SQL命中了查询缓存,就会将缓存的结果直接返回給客户端,不需要继续执行后续。如果没有命中缓存,MySQL就会继续执行后面的查询,然后将执行结果放入缓存。
那么,看起来能提高查询效率的查询缓存,为什么在8.0反而没有了呢?因为当查询的表数据被更新后,关于该表的缓存需要全部清空,对于更新频繁的表,查询缓存不光不会提高效率,还会降低效率,浪费资源。只有当业务使用的是纯静态表,查询缓存才会明显提高效率,现在对于这样的数据,往往在客户端就做了缓存,故而MySQL的查询缓存显得不必要。
在8.0以前的版本,可以按需设置是否使用查询缓存,可以将query_cache_type设置成DEMAND。这样对于默认呢的SQL语句,都不使用查询缓存,对于需要使用查询缓存的SQL语句,可以使用 SQL_CACHE
关键字显式指定。
比如:SELECT SQL_CACHE id FROM user
MySQL在这里对待执行的SQL进行分析
语法分析:用于判断该语句是否符合MySQL支持的SQL语法。如果不满足,会出现错误提示
还会在这里识别语句关键字,是查询还是更新,待执行的表名和列名等。
分析器分析出SQL需要做什么。优化器则决定了后续程序如何执行。
完成了前面的准备工作,由执行器在这里执行SQL定义的操作。
原文:https://www.cnblogs.com/barneycs/p/14389409.html