前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一条sql语句究竟是如何执行的

一条sql语句究竟是如何执行的

作者头像
程序员小饭
发布2021-01-05 10:04:20
3600
发布2021-01-05 10:04:20
举报
文章被收录于专栏:golang+phpgolang+php

点击上方蓝字关注我们

相信做后端的同学肯定离不开一个话题,就是 mysql,大家也花式的执行过各种各样的 sql 语句,然后得到返回结果,那么一条 sql 语句执行究竟经历了哪些步骤呢?今天让我们来一探究竟。

我们先来看一看 mysql 的整体的架构图

其实从上图可以看出,由客户端发出请求之后,mysql主要分为server层和存储引擎层

server层

连接器

连接器主要是与客户端建立连接, 包含本地socket和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信。连接成功之后会同时校验用户的权限,等相关安全方案。如我们常用的建立连接方式

代码语言:javascript
复制
mysql -h ip -P 3306 -u root -p

只要用过数据库的同学,相信对上面的连接方式并不陌生,在连接之后还有一些权限验证等等,这些都是在连接器中完成的。

这里需要注意的一点就是,在线上的应用中,会采用数据库连接池的方式,来避免频繁的开关连接。

另外可以用show processlist; 用来显示用户正在运行的线程。

分析器

对客户端传来的 sql 进行分析,这将包括预处理与解析过程,并进行关键词的提取、解析,并组成一个解析树。具体的解析词包括但不局限于 select/update/delete/or/in/where/group by/having/count/limit 等,如果分析到语法错误,会直接抛给客户端异常:

代码语言:javascript
复制
  ERROR:You have an error in your SQL syntax.

比如:

代码语言:javascript
复制
select * from user where userId =1234;

在分析器中就通过语义规则器将select from where这些关键词提取和匹配出来,mysql会自动判断关键词和非关键词,将用户的匹配字段和自定义语句识别出来。这个阶段也会做一些校验:比如校验当前数据库是否存在user表,同时假如User表中不存在userId这个字段同样会报错:

代码语言:javascript
复制
unknown column in field list

优化器

进入优化器说明sql语句是符合标准语义规则并且可以执行。优化器会根据执行计划选择最优的选择,匹配合适的索引,选择最佳的方案。比如一个典型的例子是这样的:

表T,对A、B、C列建立联合索引(A,B,C),在进行查询的时候,当sql查询条件是:select xx where B=x and A=x and C=x.很多人会以为是用不到索引的,但其实会用到,虽然索引必须符合最左原则才能使用,但是本质上,优化器会自动将这条sql优化为:where A=x and B=x and C=X,这种优化会为了底层能够匹配到索引,同时在这个阶段是自动按照执行计划进行预处理,mysql会计算各个执行方法的最佳时间,最终确定一条执行的sql交给最后的执行器

执行器

执行器会调用对应的存储引擎执行 sql。主流的是MyISAM 和 Innodb。

缓存

数据库在8.0以前是有缓存的,但是说实话这个用处不大,一般线上也不会开启数据库缓存,首先因为开启缓存也是占一定的开销的,另外实际应用中一模一样的sql语句重复多次查询的场景很少很少,所以在8.0以后直接把缓存给去掉了,所以缓存这里咱们就不讨论了。

总结

MySQL server层逻辑架构从上往下可以分为三层:

(1)第一层:处理客户端连接、授权认证等。

(2)第二层:服务器层,负责查询语句的解析、优化、缓存以及内置函数的实现、存储过程等。

(3)第三层:存储引擎,负责MySQL中数据的存储和提取。MySQL中服务器层不管理事务,事务是由存储引擎实现的。MySQL支持事务的存储引擎有InnoDB、NDB Cluster等,其中InnoDB的使用最为广泛;其他存储引擎不支持事务,如MyIsam、Memory等。具体过程都在图中有所标注,篇幅有限,大家可以先有个大概的认识,具体的步骤咱们后面继续更新。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员养成日记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • server层
    • 连接器
      • 分析器
        • 优化器
          • 执行器
            • 缓存
            • 总结
            相关产品与服务
            对象存储
            对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档