SQL的语句查询流程
MySQL分为Server层与存储引擎层
Server层
1.连接器 ,查询缓存,分析器,优化器和执行器等,以及所有的内置函数(如日期,时间,数字加密函数等)。
2.所有的跨存储引擎功能都在这一层实现,如存储过程,触发器,视图等
存储引擎
1.负责数据的存储于提取
2.MySQL5.5.5版本后默认的存储引擎为InnoDB
连接器
负责与客户端建立连接,获取权限,维持和管理连接
mysql -h$ip -P$port -u$user -p
长链接与短连接
长链接
连接成功后,客户端持续有链接请求,则一直使用同一连接
短连接
每次执行完很少的查询都断开连接,下次查询再建立连接
使用长链接可能会发生的问题
占内存
MySQL执行过程中临时使用的内存是管理在连接对象了吗
这些资源在连接断开后才释放,导致内存太卡,被系统强行杀掉,会导致MySQL异常重启
解决方法
定期断开长连接
执行mysql_reset_connection来初始化资源
查询缓存
一个查询请求会先到查询缓存里
以key-value对的形式,被直接缓存到内存里
key是查询的语句,value是查询的后果
如果查询缓存里没有寻找的数据,则继续后面的执行步骤,查询完后,结果会存放在查询缓存里
查询缓存的缺点
查询缓存的失效非常频繁,有时一个表的更新,此表上所有的缓存都会清空
对更新压力大的数据库来说,查询缓存的命中率非常低
一张静态表的查询才适合查询缓存
选择性使用查询缓存
将参数query_cache_type设置为DEMAND,默认SQL语句都不使用查询缓存
对于使用查询缓存的语句,用SQL_CACHE指定
select SQL_CACHE * from T where ID=10
MySQL8.0版本开始没有查询缓存功能
分析器
词法分析
识别SQL语句里面的字符串分别是什么,代表什么
例如:select关键字识别出来,字符串'T'识别成'表名T‘
语法分析
根据语法规则,判断输入的SQL语句是否满足MySQL语法
优化器
当表里有多个索引时,优化器决定使用哪个索引
一个语句有多表关联(join)时,决定各个表的连接顺序
例如
mysql> select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;
1.即可以先从表t1里取出c=10的记录,再根据ID之关联到t2,判断里面d的值是否等于20
2.也可以从t2里取出d=20的记录ID值,再根据ID值关联到t1,在判断c值是否等于10
执行器
首先判断对这个表有没有查询的权限,没有就报错
如果命中查询缓存,会在查询结果返回时,做权限验证。查询会在优化器之前调用precheck验证权限
有权限,打开表继续执行,打开表时使用的是存储引擎提供的接口