判断resultset是否遍历到最后一条记录_一条SQL语句执行得很慢的原因有哪些?

5a82df74220d59189f8b4ff25205339f.png

SQL语句的执行速度往往决定着页面的加载速度 如何优化SQL的运行速度就变得尤为重要

想知道如何优化 我们先从一条SQL的执行过程开始讲起

2609707e226ece8ab4d394331572cfc9.png

大体来说,MySQL 可以分为 Server 层和存储引擎层

存储引擎层:

从 MySQL 5.5.5 版本开始InnoDB成为了默认存储引擎(架构模式是插件式的,所以一个数据库可能有多个引擎)

Server 层:

1)连接器:连接器负责跟客户端建立连接、获取权限、维持和管理连接,客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数 wait_timeout 控制的,默认值是8小时,连接时存在长连接和短连接模式

短连接:是指在执行完几个语句过后便断开连接,之后要进行操作会重新连接

长连接:是指在执行语句时一直共用一个通道也就是一个连接(建议定期断开,否则内存占用过大会导致异常重启)

2)查询缓存:在拿到一条语句之后会先到查询缓存看看,之前知否执行过这条语句,之前执行过的语句和结果会以key-value 对的形式,被直接缓存在内存中,如果存在则会直接返回

但是大多数情况下不要使用查询缓存,因为查询缓存往往弊大于利。只要有对一个表的更新,这个表上所有的查询缓存都会被清空,所以MySQL 8.0 版本直接将查询缓存的整块功能删掉,也就是没有了

3)分析器:对SQL语句进行 词法(关键字判断) 语法(是否符合标准) 语义(整体语句意思)分析 这样机器就是你要做什么

4)优化器:选择适合索引(你得建立索引) 选择执行效率高的方案 该怎么做

5)执行器:先判断是否拥有相应的权限(在优化器之前也会调用 precheck 验证权限) 然后就开始执行 流程如下:

例:select * from T where ID=10;

  1. 调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如果是则将这行存在结果集中;
  2. 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
  3. 执行器 将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值