查看: 116|回复: 1

MySQL学习01——一条SQL语句的执行

[复制链接]

5

主题

7

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2023-1-1 09:59:48 | 显示全部楼层 |阅读模式
学习MySQL时,需要了解MySQL是如何执行一条SQL语句的,通过执行过程了解MySQL的内部架构,这里以select语句为例。
概览

MySQL 可以分为 Server 层和存储引擎层两部分。

  • Server 层包括连接器、查询缓存、分析器、优化器、执行器等。负责建立连接、分析、解析SQL语句。
  • 存储引擎负责读取、存储数据,多个存储引擎以插件形式出现在MySQL架构中,支持 InnoDB、MyISAM、Memory 等多个存储引擎,现在InnoDB是默认的存储引擎。从连接器到执行器都属于Server层,多个存储引擎共用一个Server。


连接器

连接器负责跟客户端建立连接、获取权限、维持和管理连接。
MySQL数据库属于服务端,我们的应用程序属于客户端,当我们要操作数据库时,需要将应用程序连接到数据库,连接器主要负责这项工作。
建立连接需要用户名和密码,当用户名、密码都认证通过后,连接器还需要查询你的用户拥有的权限,后续select、update、delete等语句的权限判断逻辑都依赖连接时读到的权限。所以如果要修改用户权限,需要重新建立连接。
1、如何建立连接?

mysql -h$ip -P$port -u$user -p-p后面应该接密码,但是不建议在shell语句中显示的输入密码。
执行上述语句后,就需要在交互对话框中输入密码。
2、如何查看连接?

show processlist连接信息以表的形式呈现。


3、长连接问题?

由于建立连接的过程还是有一定消耗,所以我们不希望每次执行SQL语句都要重新建立一次连接。MySQL使用的长链接的方式建立连接,建立连接成功后,当前客户端的请求都会使用这一个连接。如果客户端长时间不工作,连接器会主动断开连接,断开连接后,客户端需要重新建立连接才能与数据库进行交互。
但是所有的客户端都适用长连接的话,MySQL的内存会涨很快,这是由于MySQL在执行每个客户端的请求时,使用的内存都管理在每个连接对象中,这些资源只有断开连接时才会释放,所以连接越多,内存消耗就越大。有两个方案可以解决这个问题:

  • 定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接,之后要查询再重连。
  • 在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源。这个过程不会重新建立连接,只会将连接恢复到刚建连时的状态。
查缓存

每次执行完的SQL语句,其结果都会以k-v形式存到缓存中,key就是查询语句,value是查询结果。这样方便下次使用同样的SQL语句时能够直接在缓存中获取数据。
在实际应用中,该功能大概率会起到反效果。每次执行SQL语句后,需要将结果存到内存中,但是每当更新数据库中的数据时,缓存都会失效,所以缓存命中率一般都很低。在8.0后的版本中,就不在支持查询缓存的功能了。
分析器

分析器先会做“词法分析”。词法分析会将select关键字、代表表名的字符串、代表列ID的字符串都识别成计算机能识别的方法或变量。之后进行“语法分析”,根据词法分析得到的结果,判断SQL语句是否满足MySQL的语法,如果不满足会抛出异常。
优化器

分析器可以让MySQL直到SQL语句的功能,但是在开始执行之前,还需要进行优化,让SQL语句执行的效率更高。
比如:表有多个索引时,需要选择更快的索引。
优化器执行完成后,SQL语句的执行方案就确定下来了。
执行器

优化器确定执行方案后,执行器会执行语句。

  • 首先判断用户是否有操作这个表的权限,这个权限就是在连接过程中确定的。
  • 根据表的引擎定义,调用表中指定引擎的接口。
  • 如果执行方案中使用了索引,会根据索引找到对应的结果,否则只会根据查询条件遍历表,找到所有满足条件的结果。
回复

使用道具 举报

4

主题

10

帖子

21

积分

新手上路

Rank: 1

积分
21
发表于 2025-4-9 08:20:03 | 显示全部楼层
专业抢沙发的!哈哈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表