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

Mysql实战之一条SQL查询语句是如何执行的

原创
作者头像
特特
发布2023-02-20 23:41:43
1K0
发布2023-02-20 23:41:43
举报
文章被收录于专栏:特特的专栏特特的专栏

1.前言

作为一位开发人员,必然要和mysql打交道,平常肯定也写各种各样的sql语句,下面咱们先来看一个非常简单的sql语句

代码语言:sql
复制
select * from order  where id = 10;

我们看到这个sql,都会说,很简单的一个查询语句,执行结果是查询order表中id=10的所有数据,但是大家知道这个sql在Mysql内部是如何执行的吗?接下来,我就把一一给大家进行讲解,mysql的执行过程

3.Mysql的架构图

mysql架构图
mysql架构图

mysql整体分为两层:Server层存储引擎层

其中Server层包括连接器、分析器、优化器、执行器等,包含了Mysql的大多数核心功能,以及所有的内置函数(比如日期,时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等

存储引擎层负责数据的存储和提取。存储引擎包括InnoDB、MyISAM等,目前最常用的存储引擎是InnoDB,在Mysql5.5.5.版本开始InnoDB就是默认存储引擎了

3.连接器

第一步,需要先连接到数据库上,这时候就是连接器在发挥作用,连接器负责跟客户端创建连接,获取权限、维持和管理连接。

连接数据的命令如下

代码语言:sql
复制
mysql -h host -P port -u username -p password

输入完命令后,会出现交互式对话,让你输入密码,然后mysql客户端就会和mysql服务端建立连接,然后验证身份

  • 如果用户名或者密码不对,你就会收到一个"Access denied for user"的错误
  • 如果用户名或者密码验证通过,连接器就会通过权限表查询当前用户的权限,之后所有的操作都依赖该次查询到的权限

这也意味着如果这是修改了当前用户的权限,也不会影响之前已经连接成功的用户,只有连接中断,再重新连接才会生效。

mysql默认的连接超时时间为8小时,修改默认值可以通过wait_timeout参数。

因为每次数据库创建连接都比较好资源,所以建议使用长连接来保持数据库连接

名词解释

长连接:创建一次连接,后面的请求都使用同一个连接,不会创建新连接

短连接:每次请求都会创建一个新的连接

使用长连接存在的问题:当过多用户访问数据库的时候,会导致内存膨胀,最终产生OOM,让mysql宕机

解决方案:

  1. 定期断开长连接
  2. 如果发现比较大的请求时,执行完请求,刷新一下连接4.查询缓存连接建立完成后,就开始执行sql语句了,首先会执行查询缓存

执行sql语句会先走缓存,如果命中缓存,就直接返回结果,如果没有命中缓存,则继续往下执行

由于在mysql8.0之后查询缓存模块已经被删除,咱们也就不详细讲解这一块了

5. 分析器

如果没有命中缓存,就会走到分析器,分析器主要分为词法分析和语法分析。

分析器会先做词法分析。根据你输入的sql语句,进行关键词匹配语句类型,比如是查询、删除、修改还是新增语句,识别数据库表是否存,字段是否存在。

完成上面单词识别后,就会进行语法分析,会分析你的语法是否符合sql的规范,如果你的语句不对,就会收到”You have an error in your SQL syntax“的错误提示比如下面的语句from少打了一个f

代码语言:sql
复制
select * orm t where id = 10
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 'select * orm t where id = 10' at line 1

一般错误都在use near附近

6.优化器

经过分析器之后,mysql就知道你要做什么了,但是在具体执行之前,还会针对你的sql语句进行优化

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

比如:

代码语言:sql
复制
select * from t1 join t2 using(id) where t1.c=10 and t2.d=20
  • 既可以先从表t1里面取出c=10的记录的id的值,在根据id的值关联表t2,在判断t2里面d的值是否等于20
  • 既可以先从表t2里面取出d=20的记录的id的值,在根据id的值关联表t1,在判断t1里面c的值是否等于10

上面两种执行方法最终的结果是一样的,但是执行效率确不相同,优化器的作用就是决定使用哪一种执行方法。

优化器执行完成后,语句的执行就具体确定下来了,然后就会进入到执行器阶段了

7.执行器

mysql通过分析器知道了你要做什么,通过优化器知道了该怎么做,执行器就负责通过存储引擎执行sql了

比如:

代码语言:sql
复制
select * from order where id = 10

首先验证是否存在有查询的权限,如果没有权限,则报错SELECT command denied to user 'b'@'localhost' for table 'order'

如果有权限,则会查找order表中所有id=10的数据

8.小结

本篇主要讲解了mysql的组成架构,和sql语句执行需要经过哪些阶段,希望可以通过本篇可以让你简单了解,一个sql语句的执行流程是什么样子的,后面的篇章会根据每个流程进行展开细聊,希望对你有所帮助,感谢您的阅读

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

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