赞
踩
首先,图示简单描述一下MYSQL的大体架构。其大体结构与一般的管理系统架构类似,我们将重点关注Server层:【连接器,查询缓存,分析器,优化器和执行器】
1.连接器:用户与客户端建立连接,获取权限,维持和管理连接;
****连接方式****
短连接:操作完成后,马上close掉;
长连接:
长时间保持连接,减少服务端创建和释放连接的消耗,后面的程序访问时可以直接使用本连接(连接池使用)。默认连接时间是8小时,超时后服务器会自动将连接断开,客户端再次请求会报错!
如何解决超时断开连接问题?
1)使用程序定时断开长连接。使用一段时间后,或者程序里面执行一个占用内存的大查询后,断开连接,之后使用再重连。
2)MYSQL5.7版本及以后,执行一个大操作后,通过执行mysql_reset_connection来重新初始化连接资源。(初始化过程中无需重连和权限验证)
2.查询缓存:通过key-value形式<sql,value>存储起来,mysql默认关闭缓存(8.0之后版本没有此功能);
3.分析器: 对要执行的sql语句进行解析,最终得到抽象语法树,然后再使用预处理器判断抽象语法树中的表是否存在,存在时判断select 投影列字段是否在表中存在。
【SQL---解析---->抽象语法树----判断表是否存在---判断字段是否存在】
***3.1词法分析***
将sql拆解为不可再分的原子符号(Token)。根据不同数据库方言所提供的字典,将其归类为关键字,表达式,字面量和操作符。
***3.2语法分析***
根据词法分析拆解出的Token,将SQL语句转换为抽象语法树。
我们来看一个简单的栗子
SElECT id,name FROM t_user WHERE status = 'ACTIVE' AND age > 18;
经过词法分析和语法分析后,我们可以得到如下的抽象语法树,后面的工作均已本语法树为基础。
绿色代表SQL关键字,红色代表字面量和字段
***3.3预处理器处理***
对生成的【抽象语法树】进行语义校验(对查询的表,select字段进行校验,判断表和对应的字段是否存在)
4.优化器:将分析器得到的语法树,通过数据字典和统计信息的内容经【一系列运算】,得到一个【执行计划】
***一系列运算***
1)逻辑变换:将where条件中的条件表达式进行化简或者计算,转换为布尔或者确定值;
2)代价优化:通过一些数据统计分析的代价,来判断这个SQL执行是否可以走索引,以及走哪些索引,此外,在多表关联查询中,确定表join的顺序。
5.执行器:开始执行时判断建立连接的对象是否有权限访问对应的对象,有权限时按照执行计划执行,没有权限时,返回没有权限的错误信息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。