Mysql中select语句执行流程
1、mysql架构
mysql结构(照片有点模糊,但是不妨碍理解。大家也可自行查找) mysql主要功能模块:
1)连接器(连接/线程处理器):主要负责管理客户端连接,权限验证。
2)查询缓存:负责缓存查询结果。
3)解析器:对sql语句进行词法分析,语法分析,校验sql语句。
4)优化器:对解析器解析完成的sql生成执行计划,选择索引。
5)存储引擎:存储数据,负责提供读写接口。
其中1)至4)称为mysql服务层,5)称为mysql的存储引擎层。
2、select语句执行流程
有了上面图的理解,大家大致对mysql的结构有了大致的了解。
下面以对select语句的执行流程进行简单介绍, 假定sql语句:select * from table
1)建立连接
mysql -h ip -p port -u user -p
password
通过上面的语句和mysql服务器建立连接。如果用户名和密码不对,则会显示“Access denied for user” 的提示。
2)查询缓存
建立完连接之后,select语句执行到第二步,查询缓存。之前执行的sql语句结果会以key-value对的形式被缓存到内存中。key是sql语句,value是查询结果。如果select语句在key中,则直接返回value给客户端。
如果缓存中查询不到,就会继续执行后续阶段。执行完后将结果缓存到内存中,用于下次查询。(缓存失效非常频繁,例如update之后则会清空缓存)。
3)解析器
对于缓存失效之后,则解析器会对sql语句进行分析。先对sql语句进行词法分析,分析select * from table是否符合mysql的语法规范。然后对sql语句进行语法分析,如果sql语句不对,则会显示You have an error in your SQL syntax的错误提醒。请仔细检验sql语句语法是否规范。
4)优化器
经过解析器解析之后,mysql就知道需要做什么。在开始执行之前,优化器根据表中的索引选择使用哪个索引,或者是join时选择表连接的顺序。从而选择最优方案。
5)优化器
经过解析器之后,mysql知道做什么,经过优化器之后,mysql知道怎么做。
开始执行前,mysql先判断用户是否拥有查询权限,如果没有权限,返回没有权限的错误。即使是命中缓存,在返回结果时,也会做权限验证。最终返回查询结果。
3、总结
mysql中的select语句的执行流程大致如上所述。
以上内容仅是个人理解,如果理解有不对的地方欢迎指出,大家共同理解。
|