mysql基本架构示意图
- server层<连接器、查询缓存、分析器、优化器、执行器>
- 连接器
- mysql -h ip -u user -P port -p
- 连接器负责跟客户端建立连接、获取权限、维持和管理连接。
- 如果连接成功,连接器便会到权限表里查看该用户所拥有权限,当一个用户连接成功时,即使这个时候修改了该用户的权限,那么也不会影响已经连接的权限,修改后,只有重新连接,才会是修改后的权限。
- 如果客户端连接很久没有动静,一般8小时连接器就会自动断开。
- 如果连接被断开之后,客户端再次请求会收到一个Lost connection to MySQL server during query的错误,如果想要继续,那么就要重新连接后再执行请求。
- 查询缓存
- 一般只有在静态表或者很久不会更更新的表,适合使用查询缓存.
- 只有对表有更新,那么这个表所有的查询缓存都会失效。
- mysql8.0已删除了查询缓存整块功能。
- 分析器<词法分析、语法分析>
- 一般先做词法分析,根据用户输入的多个字符串+空格,mysql需要识别里面的字符串分别是什么,代表什么。
- 根据语法规则,然后做语法分析,根据语法分析,判断输入的sql语句是否满足mysql语法,查看sql语句是否正确。
- 如果语句不正确,就会收到一个 You have an error in your SQL syntax的错误提示。
- 一般语法错误会提示第一个错误的位置,需要关注的是 use near 后面的内容。
- 优化器
- 一般在表里面有多个索引的时候,决定使用哪个索引。
- 或者在一个语句中有多个连表,决定各个表的连接顺序。
- 执行器
- mysql通过分析器知道要做什么,通过优化器知道怎么做。
- 执行的时候,首先会判断当前所连接用户有没有对应的权限,如果没有权限,就会直接返回没有权限的错误,如果有权限,才会打开表继续执行。
- 执行器打开表的时候,会根据该表的引擎去定义使用该引擎的对应接口。
- select * from T where ID=10;
- 首先会调用innodb引擎接口获取该表第一行数据,判断id的值是否等于10,如果不是则跳过,如果是,那么则存到结果集中。
- 调用引擎接口获取下一行数据,执行同上的操作,直到该表的最后一行。
- 执行器会讲上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
- 连接器
- 存储引擎层<负责数据的存储与提取>
- 架构模式是插件式的。支出innodb、myisam、memory等多个存储引擎。- mysql默认存储引擎是innodb,如果想要指定引擎,那么就在创建表的时候,使用 create table 语句中使用 engine=memory。
课后题
如果表 T 中没有字段 k,而你执行了这个语句 select * from T where k=1, 那肯定是会报“不存在这个列”的错误: “Unknown column ‘k’ in ‘where clause’”。你觉得这个错误是在我们上面提到的哪个阶段报出来的呢?
答案:分析器是
