MySQL架构图如下:
客户端通过Tcp协议来访问数据库。当我们执行一个SQl时,步骤如下:
1、客户端向服务器端访问时,先去查询缓存(类似Redis)
MySQL自带查询缓存,首先对传过来的SQL直接进行哈希散列算法(MD5、SH1、SH2)进行转换,把哈希值当做Key与查询缓存中的Key进行对比,如果查询缓存中有该Key,直接返回Value也就是查询结果。
哈希有单一定向性,一个空格,一个标点都会有影响,因此select * from test;和 select * from test不一样,在查询缓存时可能因为有空格查不到。
2、缓存中不存在,则到解析器,解析为一个解析树。
解析器 解析关键字是否有拼写错误、顺序错误,如果解析出现问题,会返回解析内容,在Navacat中体现为错误信息。
3、解析器无误,下一步进行预处理器,产生一个新的解析树。
预处理器是检查表、列是否正确,是否在SQL命令中出现歧义。
4、MySQl自带一个查询优化器。
内置的查询优化器会对你的SQL进行优化,优化完成后生成一个执行计划。
5、执行计划会去查询目前这张表应用的引擎,通过引擎访问数据物理文件。
(引擎--MySQL跟数据文件的一个接口或纽带,有MyISAM、InnoDB等),不同的存储引擎应用的时候,生成的是不同的物理文件。
以默认引擎InnoDB为例,MySQl数据库的物理文件有以下三种:
其中:
opt文件存储的数据库的编码
frm存放表结构
idb存放数据集索引
6、把查询结果返回给客户端,同时存入查询缓存。