黑马程序员技术交流社区

标题: 【上海校区】MySQL系列之一条SQL查询语句的执行过程 [打印本页]

作者: 不二晨    时间: 2018-11-23 09:55
标题: 【上海校区】MySQL系列之一条SQL查询语句的执行过程
最近刚刚购买了极客时间的课程《MySQL实战45讲》,我会在这里将学习到的知识点做一个总结。
本节主要是讲MySQL的基础架构。比如执行以下语句时:
mysql> select * from T where ID=10;复制代码这条语句在MySQL内部是如何处理的。
基础架构图

如图 主体分为两部分:Server和存储引擎部分。
Server包括:连接器、缓存查询、分析器、优化器、执行器。存储过程、触发器、视图等功能都在Server层处理。
存储引擎负责数据的存储和提取。常见的有InnoDB、MyISAM。
连接器连接器与客户端建立连接、获取权限、维持和管理连接。
常见的命令:
mysql -uroot -ppassword
用来和服务器建立连接,TCP握手后完成认证过程。
只有在连接过程才会从权限表中读取权限信息,中途对权限的修改不会影响已经建立的连接,只有重新登陆后才会使用新的权限信息。
建立连接后如果长时间处于空闲状态,"show processlist"  命令可以看到到处于sleep状态的连接。
若规定时间内无活动,则会自动断开连接。规定时间 由 wait_timeout控制,默认为8小时。断开后,再次发请回会提示   "Lost connection to MySQL server during query" ,只能重新连接。
防止数据库中出现占用大量内存的情况,可以用一下方法解决:
查询缓存建立连接后,就可以执行select操作,这是会执行第二部分:查询缓存。
一个请求进来,首先查询缓存,是否存在该记录。之前执行过的语句,则会以语句为key,执行后的结果集为value存储在内存中。
不建议使用查询缓存,此操作弊大于利  ( MySQL8.0后将会删除该功能 )
对于一个表,只要有更新便会将涉及到该表的缓存全部清空。
只适用于不常更新的静态表
推荐:
-将query_cache_type 设置为 DEMAND,默认SQL不使用查询缓存,针对需要查询缓存的语句,使用SQL_cache显示指定,例如:
select SQL_CACHE * from T where ID = 10;复制代码分析器
这条SQL要做什么
优化器
这条SQL如何做
这个步骤将会选取最优的执行方式,例如:
执行器
真正的执行步骤
根据连接器取到的权限判断,是否对表T有权限。
打开表后,根据表的引擎定义,使用引擎提供的接口。例:
在MySQL的慢查询日志中,rows_examined字段表示该语句执行过程中扫描了多少行,这个值就是调用引擎获取数据行的时候添加的。
某些场景下,执行器调用一次,引擎内部会扫描很多行,因此引擎扫描行数跟rows_examined并不完全相同,这一点后文会详细说明。

评论区知识点:


【转载】
作者:Justd
链接:https://juejin.im/post/5bf576ad6fb9a049b221823a




作者: 小影姐姐    时间: 2018-11-26 14:12

作者: 不二晨    时间: 2018-11-28 15:44
奈斯
作者: 梦缠绕的时候    时间: 2018-11-29 18:00





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2