一个人至少拥有一个梦想,有一个理由去坚强

心若没有栖息的地方,到哪里都是在流浪

MySQL实站45讲学习笔记—01基础架构:一条sql查询语句是如何查询的?

平时开发过程中,我们只知道写sql,然后执行,并不关心一条sql查询语句是怎么执行的。但是作为一个开发人员,对于mysql底层的一些东西,还是需要了解的。学习了林晓斌的MySQL实战45讲的01讲后,懂得了mysql的基本架构如下:

《MySQL实站45讲学习笔记—01基础架构:一条sql查询语句是如何查询的?》

(借用文章图片,如有侵犯版权请联系作者删除)

 

mysql基本架构如上图,主要分为server层和引擎层。

既然是学习笔记,那么我就以我的理解描述下面这条语句的执行流程和各个流程的作用吧:

select name from student where id=1;
  1. 连接器:不管是我们用xshell去连接服务器的数据库,还是用程序去连接数据库,首先做的第一步是”登录”,连接器就是管理连接以及权限验证的。需要有数据库的ip地址,端口,用户名和密码。有了这些还不够,还要有相应的权限。例如用xshell连接数据库常用命令
    mysql -h$ip -P$port -u$user -p
    

    -h后面是host及IP地址 -P后面是port及端口,-u后面就是用户名。-p后面是密码。一般我们输入-p后就回车,回车后再输入密码。因为密码直接跟在后面很不安全。

  2. 查询缓存。连接器连接后,首先先去缓存中查询数据。缓存中是以key-value的形式存在的数据,key是查询语句,value是查询的数据。如果缓存有数据,则直接返回。如果缓存没有,则进入分析器。后面的结果也会存入缓存。
  3. 分析器。分析器是进行词法分析和语法分析的。先词法,先判断这条语句是什么语句,比如select词法分析的时候就知道了是查询,然后再语法。语法分析就是分析这条语句有没有错误,能不能执行。如果有语法错误,则会有下面错误提醒要快速定位问题,找到use near的地方。
    mysql> elect * from t where ID=1;
    
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'elect * from t where ID=1' at line 1
    

    如果查询的列不存在,则也会有错误:unknown column sex in where clause

    select sex from book
  4. 优化器。分析器执行后,就知道要做什么了。进入到优化器阶段。假如一张表你设计多个索引,优化器的作用就是选择哪一个索引能够达到最优。优化方案出来后,就进入到执行器阶段。
  5. 执行器。执行器就是操作引擎,返回数据的。开始执行的时候要先判断你对这个表有没有查询权限,如果没有则返回错误:
    mysql> select * from T where ID=10;
    
    ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost' for table 'T'

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

  6. 引擎。执行器是怎么调用引擎的呢。执行器同步调用引擎,引擎是一条条查询的,如果第一条真好满足查询条件,则把数据放在结果集中,再去查询第二条……依次循环执行下去,直到表的最后一行。最后引擎把所有满足条件的结果记录集返回给客户端。
  7. 补充。常见引擎有InnoDB,Memory,MyISAM等。我们可以在建表的时候指定引擎,例如engine=memory.如果不指定,则默认是InnoDB.至于这几个引擎的区别,感兴趣的可以网上搜搜。

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注