首先,我们了解MySQL的逻辑架构,对MySQL有一个整体的了解。
例如,当执行以下语句时:
mysql >从T中选择*其中ID = 10
我们看到的结果是返回了一条记录,那么MySQL是如何执行这条SQL查询语句的呢?
首先,我们来看一下MySQL的逻辑架构图:
一般来说,MySQL分为服务器层和存储引擎层。
服务器层包含连接器、查询缓存、分析器、优化器、执行器等MySQL核心服务功能。
存储引擎层负责存储和提取数据。它的架构是插件式的,支持InnoDB、MyISAM、Memory等多种存储引擎。
从图中不难看出,不同的存储引擎共享一个服务器层。让我们通过上面的SQL查询语句来看看整个流程和各个组件的功能。
连接器
连接器是客户端与MySQL连接的组件。客户端通过以下命令连接:
mysql -h
i
p
−
P
ip -P
ip−Pport -u$user -p
输入此命令后,输入用户名和密码。虽然可以在上述命令中同时输入密码,但是很容易造成密码泄露,特别是在生产环境中,不建议明确输入密码。
如果用户名或密码不正确,将返回“拒绝用户访问”的错误,连接将中断。
如果用户名和密码认证通过,连接器会在权限表中查找你的权限,然后这个连接的权限判断就取决于读取权限了。
这意味着在用户成功建立连接后,即使他的权限被修改,当前的连接也不会生效,除非重新连接被断开。
查询缓存
在前面的步骤中,我们与MySQL建立了连接,然后我们从客户端输入了SQL查询语句:
mysql >从T中选择*其中ID = 10
MySQL将首先在查询缓存中查找该记录是否存在。如果存在,则直接返回结果。
但是在大多数情况下,我建议您不要使用查询缓存。为什么?因为查询缓存往往弊大于利。
很容易使查询缓存中的缓存数据无效。只要更新了表中的任何数据,这个表的缓存就会被清空,特别是对于写操作频繁的应用,缓存基本没有影响。
我们可以通过将参数query_cache_type设置为DEMAND来禁用查询缓存,或者显式设置为使用查询缓存:
mysql >从T中选择SQL_CACHE *,其中ID = 10
注意:MySQL版直接删除了查询缓存的整个功能,也就是说这个功能从8.0开始就完全消失了。
分析器
MySQL如何“识别”这个SQL语句?
通过分析器,MySQL首先对SQL语句进行词法分析,提取出几个字符串。
然后分析语法,判断SQL语句是否符合MySQL语法。
如果您的语句不正确,您将收到“您的SQL语法有错误”的错误提示。例如,以下select语句缺少首字母“S”。
mysql >从t中选择*其中ID = 1;
错误1064 (42000):您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,了解在第1行“从t选择*其中ID=1”附近使用的正确语法
一般的语法错误都会提示错误发生的第一个地方,所以你要注意“用near”的内容。
【计算机】优化程序
通过分析器,MySQL知道该怎么做,在开始执行之前需要经过优化器的处理。
当表中有多个索引时,优化器决定使用哪个索引。例如,以下查询语句:
mysql >使用(ID)从t1连接t2中选择*其中t1.c=10,t2.d = 20
有两种执行方式:
从表t1读取t1.c=10线,然后读取t1。id = t2。身份证和T2。从表T2判断d = 20。
t2线。从表T2中读取d = 20,然后是t1。ID=t2。从表t1判断ID和t1.c=10。
优化器是判断选择哪个执行模式。大致的判断依据是“成本估算”。如果哪个执行模式的“成本”更低,选择哪个。
执行机构
MySQL通过分析器知道做什么,通过优化器知道怎么做,最后执行。首先MySQL会判断是否有查询权限,如果没有,会返回一个没有权限的错误,如下:
mysql >从T中选择*其中ID = 10
错误1142 (42000):对表“T”的用户“b”@“localhost”的SELECT命令被拒绝
如果您有权限,请打开该表并继续执行。打开表时,执行器会根据表中定义的存储引擎,使用存储引擎提供的接口。
例如,在我们的示例中,在表T中,ID字段没有索引,因此执行器的流程是:
调用InnoDB存储引擎接口取一行,判断ID=10。如果没有,跳过;如果是,保存到结果集中。
然后拿着下一行重复,直到表格结束。
最后,合成一个结果集并返回给客户端。