hql取满足条件最新一条记录_MySql 之一条查询sql的执行过程

每当我把一条查询sql语句写完了,并且执行完得到想要的结果。这时我就在想为什么我写这样的一条sql语句,就能给我查询出我想要的结果,为什么我写了update就能更新一条语句?它们的执行过程是什么样的?它们的原理是什么?那么接下来我们就来说说这个。

select 

上面这条查询语句非常简单,就是查询一个id为8的用户信息。那么它的执行流程是怎么样的?别急,咱们先看一张图,

v2-0c8d7c6e73ea16377a38e793baa0314d_b.jpg

根据上面的图,咱们一步一步来分析。从图中可以看出整个执行过程大致可以分为两部分,分别是server层和引擎层。

server层中又分为连接器、分析器、查询缓存、优化器以及执行器几部分。

引擎层则是主要负责存储数据,提供读写接口。

那么接下来从头开始分析。

1、连接器

首先要操作数据库,那么必须得连接上数据库,所以这时候就用到了连接器。当你输入 “mysql -h$ip -P$端口 -u$登录名 -p ” 时就表示要进行连接数据库了,然后输入密码进行连接。如果密码或者用户名错了,则会报如下错误:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

如果输入用户名和密码正确,那么连接器接下来就去权限表中查询你登录用户所拥有的权限,之后此用户操作数据的权限判断逻辑都将依赖查询到的权限。哪怕你修改了此用户的权限也还是没用,必须重新新建连接,修改的权限才会生效。

另外说到这里就顺便提一下,客户端连接mysql服务器时,如果连接一直处于空闲状态,那么到了一定的时候就会断开连接,多长时间是由 wait_timeout 控制的,其默认是8个小时。如果超过8个小时,你执行操作数据库时就回提示 “Lost connection to MySQL server during query”,这时只有重新连接数据库方能进行操作。

说到连接器,咱们得说一下长连接和短链接。长连接就是如果客户端一直都有请求操作数据库,那么就会一直使用这个连接进行操作。短链接就是每次执行完很少的数据库操作就断开连接了,如果再有请求就必须重新连接。

所以这里建议减少数据库的连接操作,尽量使用长连接。但是长时间使用长连接会导致一个问题,那就是mysql的占用的内存会越来越大,甚至到最后可能会出现OOM情况,导致mysql异常重启,那么这就尴尬了。

针对上面的情况有两种解决办法:

(1)、定期断开长连接,或者断开一些查询占用内存比较大的操作的连接,释放资源。

(2)、如果是5.7及以上版本,可以使用 mysql_reset_connection 来重置连接,但是需要注意以下几点

  • 活跃事务会被回滚,自动提交模式也会被重置;
  • 释放所有表锁;
  • 关闭&删除所有临时表;
  • 会话变量(选项)被重置成和全局变量一致;
  • 用户级变量丢失;
  • PREPARE语句会被释放(其相应的HANDLER也会被关闭);
  • LAST_INSERT_ID值重置为0;
  • 利用GET_LOCK获取的锁会被释放。

以上是mysql官微给出的解释,所以重置连接的时候以上因素,以免对数据库中的数据产生影响。

2、查询缓存

客户端连接成功mysql服务器后,执行上面的一条sql时,首先会去缓存中查询是否有数据,如果有数据,那么直接把数据返回给客户端,后面的步骤都省略了。它的原理怎样的呢?请接着往下看,一条查询sql的首次执行完成后,会把sql语句作为key,把查询出来的数据作为value放入到缓存中,如果后面再有相同的查询,那么直接从缓存中取值便可。

看到这里也许你们会想缓存这么好用,那以后要多用缓存。别急,请接着往下看。查询缓存用起来确实好用,但是它有一个弊端,那就是当这个表做了更新操作时,那么此表的缓存将会全部清空。也许当你辛辛苦苦缓存起来的数据,还没来得及用时就可能被一条update语句给全部干掉。

所以如果更新比较频繁的表是不适合使用缓存的,如果是某些配置表倒是比较适合缓存的使用。

在mysql中的查询语句使不使用缓存时看query_cache_type的值,当为0时关闭缓存,当为1时表示开启缓存,当为2(DEMAND)时表示只有在sql语句中带有 SQL_CACHE 关键字才会使用缓存,如下sql

select SQL_CACHE * from user where id=8

不过需要注意的一点是 mysql 8.0 版本已经把缓存功能完全移除,所以这一块需要注意一下。

3、分析器

当执行一条查询sql时,会优先取查询缓存,如果缓存中没有数据,那么便会开始sql的真正的执行流程。首先是分析器,其主要就是对sql语句进行 “词法分析” 和 “语法分析”。

词法分析 就是对sql中的单词进行逐个的分析,比如 从 select 可以识别出要执行查询操作,user则是识别成表user,id则识别成user表中字段id。

语法分析就是分析整条sql是否符合mysql的语句,比如 你故意把sql中的 where 后面不跟条件,那么语法就肯定会问题,那么此时就会给你提示 “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 '' at line 1” 。如果给出类似的提示,那么基本就是语法错了,那就得仔细检查一下写的sql语句了。

4、优化器

经过了分析器这一层,那么接下来就要进入优化器了。从分析器中我们已经知道这条sql是要执行更新还是查询操作。那么优化器便是要对这条sq执行之前l进行优化处理,有哪些优化处理呢?例如 某表有多个索引的时候 决定用哪一个索引;或者多关联(join)查询的时候,决定关联的顺序。比如下面一条sql

select * from user u join  score s using(ID)  where u.id=20 and s.scores=80;

上面一条 sql 可以分为两种情况

  • 既可以先从表user里面取出id=20的记录的ID值,再根据ID值关联到表socre,再判断score表里scores的值是否等于80。
  • 也可以先从表score里面取出scores=80的记录的ID值,再根据ID值关联到user,再判断user表里面id的值是否等于20。

这两种方案得出的结果是一样的,但是执行的效率是不一样的,而优化器作用便是从中选择一个方案。

5、执行器

当优化器选择好了方案,那么便进入执行器阶段,这时候就要开始执行sql了。执行sql前要查询一下你对需要操作的表是否有对应的操作权限,如果没有操作权限,则会给出提示 “ERROR 1142 (42000): SELECT command denied to user 'b'@'localhost' for table 'XXX‘ “ 。

如果有对应表的操作权限,那么便打开表继续执行,执行器会根据定义的表的引擎,来执行引擎提供的对应读写的接口,mysql 5.5版本之后 默认的引擎为 InnoDB。

其大致流程如下:(假如 id 是没有索引的)

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

如果是 id 是有索引的,第一次调用的是“取满足条件的第一行”这个接口,之后循环取“满足条件的下一行”这个接口,基本和上面差不多。这些接口都是引擎中已经定义好的。

至此 一条 sql 便执行完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高糊马赛克秒变高清,表情帝:这还是我吗?

全世界有3.14 % 的人已经关注了爆炸吧知识来源:机器之心参与:魔王、杜伟有了这个工具,我们终于能够看到马赛克下的那张脸了。给出一张高糊人脸照片,你能用它做什么?杜克大学近期的一项研究可以将高糊人脸照片转换成清晰…

diy计算机组装注意事项,自己组装电脑要注意什么?DIY老司机教你装机注意事项...

相比品牌机,组装电脑的优势在于个性化的DIY硬件定制,让玩家可以自由选择适合自己的配置,可以说可玩度非常高。如今,电脑硬件设计已经十分人性化,网上还有很多直播教程,用视频的方式直观地教大家装机&#x…

Dapr + .NET Core实战(三)状态管理

状态管理解决了什么分布式应用程序中的状态可能很有挑战性。例如:应用程序可能需要不同类型的数据存储。访问和更新数据可能需要不同的一致性级别。多个用户可以同时更新数据,这需要解决冲突。服务必须重试 与数据存储交互 时发生的任何短期暂时性错误。…

Building JavaScript Games for Phones Tablets and Desktop(3)-创造一个游戏世界

2019独角兽企业重金招聘Python工程师标准>>> 创造一个游戏世界 这章教会你如何通过内存中储存的信息创造一个游戏世界。介绍了基本类型和变量并且这些变量是如何储存和改变信息的。接下来,你会看到如何用对象储存更复杂的信息,里面包含成员变…

我女朋友让我删前任,我明明删了她还是要分手...

1 人家都已经删了你还有什么不满意???▼2 高跟鞋翻车现场▼3 渣男总能渣出新花样▼4 现在的小朋友懂得也太多了吧!▼5 耍帅不可怕,谁失败谁尴尬▼6 朋友,你清醒一点!那个小手是鼠标&#…

你知道哪些开源基金会?

从 RMS 创立 FSF 发起自由软件运动,再到 OSI 成立并明确开源软件定义,这种崇尚开放协作的软件开发模式迅速席卷全球。除 FSF 与 OSI 外,还陆续诞生了许多致力于推广和发展开源的基金会。开源基金会对于开源软件和开源社区的组织、发展、协同创…

bpmn如何查看代码 idea_提高程序员效率的IDEA插件推荐(五大神器)

1. SequenceDiagramSequenceDiagram 可以根据代码调用链路自动生成时序图,超级赞,超级推荐!这对研究源码,梳理工作中的业务代码有极大的帮助,堪称神器。安装完成后,在某个类的某个函数中,右键 -…

一张纸还能上天能救命?理工男宁愿放弃NASA百万年薪,也要回家折纸?!

全世界有3.14 % 的人已经关注了爆炸吧知识一张纸能做什么?小时候,它可能默默记录着你天马行空的想象力:而到了艺术家手中,它们就会变幻成各种各样精妙绝伦的艺术品:可当一双文艺的手,遇上一颗聪明无比的“理…

【干货】单日10亿GMV的.NET5电商平台,是如何设计的?

自京东和唯品会转了Java,.NET就一直缺乏高并发电商案例,.NET5能做高并发电商吗?必须的,别停留在.NET Framework的旧印象了!这里为大家分享一家上市公司的项目案例,纯.NET5电商平台,轻松承接双11…

通过 Lotus Domino Java 代理消费 Web 服务

Web 服务是一种允许两台或更多的计算机在网络中交互的系统设计。这种服务的主要优点是,它是在多台不同操作系统的计算机和应用服务器之间发送对象的标准解决方法。例如,我们的公司使用 Web 服务从一台运行 Microsoft .NET Framework 的计算机向基于 IBM …

goahead如何使用cgi服务_QQ如何设置使用代理服务器?

很多人可能会问了,QQ上可以设置代理服务器吗?答案是可以的。今天就为大家详细介绍一下,如何在QQ上设置代理服务器的。1、双击QQ图标,打开QQ登录界面,我们就可以看到界面右上角有一个“设置”按钮。QQ如何设置使用代理服务器12、点…

android listview添加数据_Android面经分享,失业两个月,五一节前拿到offer

秦子帅明确目标,每天进步一点点.....作者 | 天天有道地址 | juejin.im/post/5eb01866f265da7b9c24562c基本介绍今天介绍一位朋友的经历:从3月初开始复习,准备面试题。复习的资料主要为《Android开发艺术探索》和jsonchao的博客,…

Dapr + .NET 实战(四)发布和订阅

什么是发布-订阅发布订阅是一种众所周知并被广泛使用的消息传送模式,常用在微服务架构的服务间通信,高并发削峰等情况。但是不同的消息中间件之间存在细微的差异,项目使用不同的产品需要实现不同的实现类,虽然是明智的决策&#x…

这些数学趣图,数学老师看了后会怎么想?

全世界有3.14 % 的人已经关注了爆炸吧知识这个扣分不?我的人生98%的时间都是无比正确的数学与我不能言语的关系最深情的告白限速是......当我完成数学作业后....维生素C的来历高数课堂恩..... 来拜师了啊, 好好学习. 为师给你命名: 阿尔法狗.这个是驻点, 这是最值, 这些机器学…

COM 组件设计与应用(六)

一、前言  1、与 《COM 组件设计与应用(五)》的内容基本一致。但本回讲解的是在 vc.net 2003 下的使用方法,即使你不再使用vc6.0,也请和上一回的内容,参照比对。   2、这第一个组件,除了所有 COM 组件必须的 IUnknown 接口外&…

python 柱状图 间距_专题第18篇:Python 绘图入门

我的施工之路1我的施工计划2数字专题3字符串专题4列表专题5流程控制专题6编程风格专题7函数使用8面向对象编程(上篇)9面向对象编程(下篇)10十大数据结构11包和模块使用总结12Python正则专题总结13设计模式14Python时间模块总结15 Python 装饰器16 Python 迭代器17 Python 生成器…

WPF实现截屏(仿微信)

WPF开发者QQ群: 340500857 | 微信群 -> 进入公众号主页 加入组织欢迎转发、分享、点赞、在看,谢谢~。 前言有小伙伴需要在软件反馈窗体增加截图功能需求,所以今天来实现一个仿微信的截图。01—效果预览效果预览(更多效果请下…

我妈要把闺蜜介绍给我当女朋友......

1 反正手没闲着啊▼2 这...这女孩子不会是您跳广场舞认识的吧?▼3 这就是生活▼4 有画面感了▼5 这种运动会想想就觉得很好看▼6 电脑屏幕不亮手机玩起来不够舒服▼7 这种脱衣方式可真是太酷啦!▼你点的每个赞,我都认真当成了喜欢

topic数量是指什么_一个网站的IP、UV和PV到底是什么

在百度统计后台会看到“IP统计”、“UV统计”、“PV统计”,那么、什么是IP,什么是UV,什么又是PV,三者之间有什么关系,IP重要,还是UV重要,还是PV重要。什么是IP?IP即:Inte…

发布一个博客园专用Windows Live Writer代码插件

一直用Windows Live Writer写博客,不过没找到能与博客园配合得很好的代码插件,每次写完文章发布到博客园总要手动修改代码。所以我自己写了一个博客园专用的Windows Live Writer代码插件(我知道这世界上已经有N个代码插件,好吧&am…