MySQL实战 45讲-第一讲
- 
第一讲:一条SQL查询语句是如何执行的?
- mysql服务端(server)的主要模块包含以下几个部分:
- 
连接器:登录权限校验 
- 
分析器:词法分析和语法分析,包括表名字段名是否正确 
- 
优化器:根据走什么索引之类的效率来优化 
- 
执行器:调用存储引擎层的接口,获取最后的结果。 
 
- 
- 存储引擎:提供crud等接口供MySQL server端的执行器调用
- 
连接器: 
 每个连接会有默认的最长连接时间,超时会断开。
 连接操作很复杂,尽量减少多次连接,也就是多使用长连接。
 长连接也有缺点,每个连接中使用到的临时内存会被连接所管理,所以长连接未及时关闭会造成OOM,可以采用定时关闭长连接+执行完大内存sql后主动关闭连接。
- 
关于查询缓存:只有当sql一模一样且不包含某些函数(例如now())的查询才会走缓存,但是缓存的效率极低,一个表更新,整表的缓存都会失效。 所以mysql8.0之后删除了查询缓存。 
- 
分析器:词法分析+语法分析,语法分析包含了对表权限的校验和列名,字段的检查等等。例如查询一个没有权限访问的表的同时输入错误的列名,会报无权限。 
- 
优化器:例如select * from a join b where a.id = x and b.id = y 这条语句,有两种执行情况: - 1.筛选 a.id = x的数 join 到b 表,再筛选b中id = y的数。
- 2.筛选 b.id = y的数 join 到a 表,再帅选a中id = x的数。
 优化器会根据两种情况的效率来选择执行哪一种。 
- 
执行器:,执行器会在执行前判断用户是否有这个表的权限,之所以这里还需要权限校验,是因为不在sql里的表也可能会被sql访问到(例如外键的校验,触发器)。 
 例如select * from tableA where a=x and b=y, 如果a和b都没有索引,执行器的执行过程是:- 1.调用存储引擎接口,查询第一行是否满足a=x and b=y,如果不是则跳过,是则加入结果集。
- 
- 循环读取"下一行",知道最后一行。
 
- 
- 返回结果集。
 
 
- 
复习Q:- 
- MySQL的框架有几个组件, 各是什么作用?
 
- 
- Server层和存储引擎层各是什么作用?
 
- 
- you have an error in your SQL syntax 这个保存是在词法分析里还是在语法分析里报错? (词法分析,例如把select拼错)
 
- 
- 对于表的操作权限验证在哪里进行?
 
- 
- 执行器的执行查询语句的流程是什么样的?
 
 
- 
 查看12道真题和解析
查看12道真题和解析