整体逻辑结构
整体上,MySQL分为 Server层 与 存储引擎 两部分,本篇主要解析Server层。
MySQL基础架构
连接器
基础命令:
mysql -h$ip -P$port -u$user -p
通过TCP握手,使用用户名、密码进行身份确认,有两个结果:
- 1)确认失败,结束执行。
- 2)确认成功,读取对应账户权限,此链接内所有权限判断均以此为标准。
连接完成之后,无后续动作则进入空闲状态,默认持续8小时,超时后断开。
建议:尽量使用长连接。
长连接的负面影响:执行过程中的临时内存是管理在连接对象中,只有在断开时才释放,这就导致内存占用随时间的增长而过大,系统会强行杀死(OOM),即异常重启
解决方案:
- 1)定期断开长连接
- 2)5.7 or Higher ,大操作后执行mysql_reset_connection,将连接恢复至刚创建的状态。
查询缓存
每个查询语句,执行时都将首先到查询缓存进行匹配,若之前有相同的查询,其结果将可能以KV形式(K为语句,V为结果)缓存在内存当中,若命中,将直接返回结果。若未命中,则继续执行后续操作。
建议:不是用查询缓存,弊大于利,因为对表进行任何更改都会清除相关查询缓存。
-- 按需调用查询缓存
select SQL_CACHE * from T where ID=10;
分析器(做什么)
对SQL语句进行解析:
- 1)词法分析:拆解语句,识别字符串含义。
- 2)语法分析:根据语法规则,判断SQL是否合法
优化器(怎么做)
- 1)在表里有多个索引的时候,决定使用哪个索引
- 2)在join的时候,决定各表的连接顺序
执行器
- 1)首先判断用户权限,无权限返回错误,有权限就打开表继续执行。
- 2)打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。
- 3)通过接口取出数据,将符合条件的结果存在结果集中,重复执行操作,直至表结束
- 4)将结果集返回给客户端