1.连接器
负责客户端和MYSQL连接时的校验和权限验证
短连接:一段时间就断开然后重连,身份校验和权限验证不是一个轻松的活。所以不推荐
长连接:一般的情况都是长连接,但是长连接如果长时间不断开,会出问题,原因是:我们连接数据库所使用的内存都是数据库那边的,所以如果长时间不解放我们所占用的数据库服务器资源就会将内存挤爆。解决办法:
- 定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接,之后要查询再重连。
- 如果你用的是MySQL 5.7或更新版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。
还有另一种问题就是我们如果长时间的长连接一直在休息,也就是说我们有个客户端在一直连接着MYSQL服务器,但是一直没用,我们可以通过设置参数wait_timeout自动断开,默认是8小时。
单位为秒
2.分析器
负责代码的词法分析和语法分析
select * from t where ID=1;
词法分析:举个例子 看是select 然后将语句中的t翻译成 表t 将 ID 翻译成那张表中的 ID字段
语法分析 如果你的语句存在语法分析,它会直接报错。
3.优化器
1.决定走那条索引
2.如果是两张表的连接查询,就需要选择哪张表是主表,哪张表是次表。
4.执行器
1. 执行语句。
5.查询缓存
查询缓存,顾名思义就是我们查询出来的东西的缓存,如果我们这次查询语句刚好和上次查询的雨具一样,那么就会直接返回查询出来的值,就是一个key-value key就是我们的查询语句,value就是我们查出来的数据。
但是一般在生产数据库服务器我们不会开,为啥?因为弊大于利
查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率会非常低。除非你的业务就是有一张静态表,很长时间才会更新一次。比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。
好在MySQL也提供了这种“按需使用”的方式。你可以将参数query_cache_type设置成DEMAND,这样对于默认的SQL语句都不使用查询缓存。而对于你确定要使用查询缓存的语句,可以用SQL_CACHE显式指定,像下面这个语句一样:
select SQL_CACHE * from T where ID=10;
需要注意的是,MySQL 8.0版本直接将查询缓存的整块功能删掉了,也就是说8.0开始彻底没有这个功能了。