一条sql的执行流程
- 客户端连接Mysql,连接器负责连接管理和权限认证。
- 连接之后会将查询缓存中,如果缓存命中了,再检查时候有访问的权限,如果有,则返回数据集,否则执行3。
- 分析器负责对sql语句先解析语句,再检查语句是否正确,交于优化器。
- 优化器负责索引的选择和多表连接时选择查询顺序,之后交于执行器。
- 执行器首先判断时候有权限访问表,如果有的话执行器就根据表的定义的引擎去调用引擎接口,再接收数据集。
- 返回数据集给客户端。
查询缓存好吗?
查询缓存中的好吗?是不是要开启查询缓存呢?其实不建议开启查询缓存,原因是缓存失效非常频繁,只要表更新了,缓存就会失效。所以对于那些更新操作多的表来说简直是灾难,除非是静态表,所以在mysql8中已经将查询缓存取消了。
Mysql中的长链接和短连接,长连接会导致什么问题?
- 长连接是指,当客户端连接数据库之后,如果持续访问数据库,将保持连接。
- 短连接是指,当客户端连接数据库之后,在很少的几次操作之后就会断开连接。
那是不是长连接就一定好呢?其实不是的,在长连接中,会产生大量的内存使用,这些内存会保存在连接对象中,所以长连接会导致内存涨的很快,会到值OOM,表现的就是mysql异常重启,那怎么解决呢?我们可以适时地将长连接断开,这样内存就可以回收了,还有一个办法就是重置连接对象,利用mysql_reset_connection命令,这样就不用重连数据库了,只是恢复连接对象到刚连接的状态。
为什么查询权限要在执行阶段?
这是因为sql操作涉及的表不一定只有sql语句中的那些,要在执行器阶段才能确认。
问题:
如果表 T 中没有字段 k,而你执行了这个语句 select * from T
where k=1, 那肯定是会报“不存在这个列”的错误: “Unknown column ‘k’ in
‘where clause’”。你觉得这个错误是在我们上面提到的哪个阶段报出来的呢?
答:分析器阶段,在分析器阶段解析器会解析sql语句生成一颗解析树,判断表时候存在,列字段是否存在等。