MySQL可以分为两大部分,一个是Service层,一个是引擎层。
Service层:
公共部分,所有引擎共享,涵盖了MySQL的大部分功能,以及所有的内置函数。它又分为四个部分:连接器、查询缓存(MySQL8.0之后已经去除,效果不好,还占内存)、分析器、优化器、执行器。
1. 连接器
链接数据库,校验用户名、密码,加载用户权限。
用户登陆后,即使权限发生变更,也不会立即生效,而是在下次登陆后生效。
链接分为两种:长连接和短链接。
建议使用长连接。
长连接也有缺陷,长时间使用后,它会把查询的数据、以及操作(undo-log)放在内存中,会造成内存急速增长,导致数据库异常重启。
处理方式:在适当的时候初始化长连接、或者定期断开长连接。
2. 查询缓存(8.0之后就没有了)
MySQL得到一个查询请求之后,会先到缓存中查询,没有找到,再去磁盘上找。找到后,先放入缓存,在返回查询信息。
一张表如果发生的变动,那么当前表上的查询缓存会全部作废。
相当于你费尽心力做完了事情,用的时候发现已经失效了,然后在做一遍,再去用的时候还是失效。
这样一直做,就显得很呆。
3. 分析器
分两个步骤:词法分析、语法分析。
1. 词法分析:分析SQL语句中的单词,校验表名和列名。
2. 语法分析:校验你的SQL语句是不是正确,错了的话你会看见【You have an erro in your SQL……】,错误提示会放在语句的第一个错误处。
4. 优化器
对SQL语句分析完成后,优化器会判断是否使用了索引。
如果存在多个索引,它会挑选使用哪个。
如果存在多表,它会选择表的链接顺序。
并不是说你写一个join in 或者and 就按你的来。
例:a.id = 1 and b.id =10,可以取表a中id = 1 的数据去匹配表b中id=10的数据,也可以反着来。
5.执行器
执行之前,校验当前用户是否有权限操作涉及的表。
没有权限就报错。
权限通过就会打开当前表,根据表定义的引擎,调用对应的引擎方法。
没有索引,就会调取当前表的第一行,再判断条件,符合就放入结果集,不符合跳过,一直到表的最后一行。
有索引,就会把满足条件的数据放入结果集,不是遍历全表(具体做法等我学了索引之后再写)。
引擎层
MySQL的引擎是以插件形式存在的。
当前默认引擎是InnoDB(5.5版本后),它不是一个官方引擎。
因为InnoDB的redo-log(物理日志),它成为了默认引擎。
----今天的姿势又增加了