优秀的编程知识分享平台

网站首页 > 技术文章 正文

MYSQL中一条SELECT语句是如何执行的?

nanyue 2024-09-05 18:18:14 技术文章 8 ℃

  接下来通过语句弄明白整个Select语句的内部运行状态:

  连接器:

  Mysql>mysql -uroot -p

  你首先连接到这个数据库上;链接器负责跟客户端建立连接,获取权限,维持和管理连接

   ●如果密码不对,你会收到“access denied for user”,然后客户端程序执行结束

   ●如果密码认证通过,连接器会从权限表里查出你的权限;之后你所有的操作都依赖于此时得到的权限

  连接完成后,如果你没有后续的动作,这个连接就处于空闲状态,sleep表明其处于空闲状态

  客户端如果太久没动静,链接器会自动断开,默认时间8小时;wait_timeout参数控制

  如果,连接断开,客户端再次发送请求后,会收到一个错误:“lost connection to mysql server during query”;这时候,你需要重新连接,然后再执行请求;

  查询缓存:

  一个select语句,会先到查询缓存中看看,若是以前执行过,直接将查询结果返回给客户端,若是查询缓存没有命中,就需要执行后面的计划

  分析器

  如果没有命中查询缓存,就要开始分析器了;

  mysql> select sql_cache * from T where ID=10;

  词法分析:比如,T识别为表,select识别为查询,ID识别为字段

  语句分析:语法不对,会报错(5·5·5与8·0语法有些许不同)

  优化器

  经过分析器,mysql知道你要干什么了,在开始执行前,还要经过优化器的处理

  优化器:在表里有多个索引的时候,决定使用哪个索引;在一个表里有多表关联时,决定各表的连接顺序;

  很多时候,两种执行方法的逻辑结果是一样的,但是执行效率会有不同,而优化器就是决定选择哪个方案;

  执行器

  mysql> select sql_cache * from T where ID=10;

  Mysql通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是进行了执行器阶段;

  开始执行的时候,要先判断一下你对这个表T有没有查询的权限,如果没有,就会返回没有权限的错误:

  “select command denied to user “”,for table T ”

  如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口;

   ●调用innodb引擎接口取这个表的第一行,遍历所有的判断字段,如果满足,就将查询结果存在结果集

   你可以在rows_examined的字段,表示这个语句执行过程中扫描了多少行,这个值是累加的;

最近发表
标签列表