MySQL执行流程执行流程
一条一条SQL语句是怎么执行的?语句是怎么执行的?
1.1 连接连接
首先,数据是存储在MySQL服务端的,应用程序或者工具都是客户端,客户端想要读写数据,第一步得跟服务端建立连接。
1.2 查询缓存查询缓存
MySQL内部自带了一个缓存模块,但是MySQL的缓存默认是关闭的,因为MySQL自带的缓存的应用场景有限,第一个是它要
求SQL语句必须一模一样,例如中间多一个空格、字母大小写不同都被认为是不一样的SQL语句。
第二个是表里面的任何一条数据发生变化的时候,这张表所有的缓存都会失效,所以对于大量数据更新的应用,也不适合。
缓存这一块还是交给ORM框架,或者独立的缓存服务,比如Redis来处理更合适。
在MySQL8.0中,查询缓存已经被移除了。
可以使用这行语句来查看MySQL查询缓存的相关属性
show variables like 'query_cache%';
1.3 语法解析和预处理语法解析和预处理
假如随便执行一个字符串,服务器报了一个1064的错:
[Err] 1064 – You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the
rightsyntaxtousenear’penyuyan’atline1 它是怎么知道输入的内容是错误的?
这个就是MySQL的Parser解析器和Preprocessor预处理模块。
这一步主要做的事情是对SQL语句进行词法和语法分析和语义的解析
1.3.1.词法解析词法解析
词法分析就是把一个完整的SQL语句打碎成一个个的单词。
比如一个简单的SQL语句:
select name from user where id=1
它会打碎成8个符号,每个符号是什么类型,从哪里开始到哪里结束。
1.3.2.语法解析语法解析
第二步就是语法分析,语法分析会对SQL做一些语法检查,比如单引号有没有闭合,
然后根据MySQL定义的语法规则,根据SQL语句生成一个数据结构。
这个数据结构我们把它叫做解析树(select_lex)。