作为Web开发人员,虽并非专业的DBA,但我们总是离不开数据库。一般开发员只会应用SQL的四条经典语句:select,insert,delete,update。以至于从来没有研究过它们的工作原理,在这里我们说一说select在数据库中的工作原理。

B/S架构中最经典的话题无非于三层架构,可以大概分为数据层,业务逻辑层和表示层,而数据层的作用一般都是和数据库交互,例如查询记录。我们经常是写好查询SQL,然后调用程序执行SQL。但是它内部的工作流程是怎样的呢?先做哪一步,然后做哪一步等,我想还有大部分朋友和我一样都不一定清楚。

第一步:应用程序把查询SQL语句发给服务器端执行

我们在数据层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发送给服务器处理。

第二步:服务器解析请求的SQL语句

1.SQL计划缓存,经常用查询分析器的朋友大概都知道这样一个事实,往往一个查询语句在第一次运行的时候需要执行特别长的时间,但是如果你马上或者在一定时间内运行同样的语句,会在很短的时间内返回查询结果。

原因:

服务器在接收到查询请求后,并不会马上去数据库查询,而是在数据库中的计划缓存中找是否有相对应的执行计划,如果存在,就直接调用已经编译好的执行计划,节省了执行计划的编译时间。

如果所查询的行已经存在于数据缓冲存储区中,就不用查询物理文件了,而是从缓存中取数据,这样从内存中取数据就会比从硬盘上读取数据快很多,提高了查询效率.数据缓冲存储区会在后面提到。

2.如果在SQL计划缓存中没有对应的执行计划,服务器首先会对用户请求的SQL语句进行语法效验,如果有语法错误,服务器会结束查询操作,并用返回相应的错误信息给调用它的应用程序。

注意:此时返回的错误信息中,只会包含基本的语法错误信息,例如select写成selec等,错误信息中如果包含一列表中本没有的列,此时服务器是不会检查出来的,因为只是语法验证,语义是否正确放在下一步进行。

3.语法符合后,就开始验证它的语义是否正确,例如,表名,列名,存储过程等等数据库对象是否真正存在,如果发现有不存在的,就会报错给应用程序,同时结束查询。

4.接下来就是获得对象的解析锁,我们在查询一个表时,首先服务器会对这个对象加锁,这是为了保证数据的统一性,如果不加锁,此时有数据插入,但因为没有加锁的原因,查询已经将这条记录读入,而有的插入会因为事务的失败会回滚,就会形成脏读的现象。

5.接下来就是对数据库用户权限的验证,SQL语句语法,语义都正确,此时并不一定能够得到查询结果,如果数据库用户没有相应的访问权限,服务器会报出权限不足的错误给应用程序,在稍大的项目中,往往一个项目里面会包含好几个数据库连接串,这些数据库用户具有不同的权限,有的是只读权限,有的是只写权限,有的是可读可写,根据不同的操作选取不同的用户来执行,稍微不注意,无论你的SQL语句写的多么完善,完美无缺都没用。

6.解析的最后一步,就是确定最终的执行计划。当语法,语义,权限都验证后,服务器并不会马上给你返回结果,而是会针对你的SQL进行优化,选择不同的查询算法以最高效的形式返回给应用程序。例如在做表联合查询时,服务器会根据开销成本来最终决定采用hashjoin,mergejoin,还是loopjoin,采用哪一个索引会更高效等等,不过它的自动化优化是有限的,要想写出高效的查询SQL还是要优化自己的SQL查询语句。

当确定好执行计划后,就会把这个执行计划保存到SQL计划缓存中,下次在有相同的执行请求时,就直接从计划缓存中取,避免重新编译执行计划。

第三步:语句执行

服务器对SQL语句解析完成后,服务器才会知道这条语句到底代表了什么意思,接下来才会真正的执行SQL语句。

这时分两种情况:

如果查询语句所包含的数据行已经读取到数据缓冲存储区的话,服务器会直接从数据缓冲存储区中读取数据返回给应用程序,避免了从物理文件中读取,提高查询速度。

如果数据行没有在数据缓冲存储区中,则会从物理文件中读取记录返回给应用程序,同时把数据行写入数据缓冲存储区中,供下次使用。

说明:SQL缓存分好几种,这里有兴趣的朋友可以去搜索一下,有时因为缓存的存在,使得我们很难马上看出优化的结果,因为第二次执行因为有缓存的存在,会特别快速,所以一般都是先消除缓存,然后比较优化前后的性能表现,这里有几个常用的方法:

DBCC DROPCLEANBUFFERS

从缓冲池中删除所有清除缓冲区。

DBCC FREEPROCCACHE

从过程缓存中删除所有元素。

DBCC FREESYSTEMCACHE

从所有缓存中释放所有未使用的缓存条目。

SQLServer2005数据库引擎会事先在后台清理未使用的缓存条目,以使内存可用于当前条目。但是,可以使用此命令从所有缓存中手动删除未使用的条目。

这只能基本消除SQL缓存的影响,目前好像没有完全消除缓存的方案,如果大家有,请指教。

结论:只有知道了服务执行应用程序提交的SQL的操作流程才能很好的调试我们的应用程序。

确保SQL语法正确;

确保SQL语义上的正确性,即对象是否存在;

数据库用户是否具有相应的访问权限。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

mysql select内部原理_数据库SQL SELECT查询的工作原理相关推荐

  1. mysql 的命名管道_笔记27-徐 SQLSERVER命名管道工作原理

    1 --SQLSERVER命名管道工作原理 2 --SQL首先在服务器上创建一个命名管道并监听之,然后客户端即连接到这个命名 3 --管道上来进行对话.对每一个客户端命名管道连接请求SQL都会创建一个 ...

  2. mysql源生插入数据_数据库的源生查询

    源生查询:<?php namespace app\index\controller; use \think\Db; class Index { public function index() { ...

  3. java 网页应用 原理_【转载】Web应用工作原理

    问题描述: Web应用工作原理 问题解决: 前言 什么是web应用程序?web应用程序又是如何进行工作的呢?什么是动态网页技术?又有 哪些动态网页技术呢?这次这篇文章需要探求总结的. Web应用 我们 ...

  4. eja智能压力变送器工作原理_电量变送器是什么?电量变送器工作原理解析

    电量变送器的定义 电量变送器是一种将被测电量(交流电压.电流.有功功率.无功功率.有功电能.无功电能.频率.相位.功率因数.直流电压.电流等)转换成按线性比例直流电流或电压输出(电能脉冲输出)的测量仪 ...

  5. 扫地机器人返充原理_全自动智能扫地机器人的工作原理分析

    扫地机器人,又称自动打扫机.智能吸尘.机器人吸尘器等,是智能家用电器的一种,能凭借一定的人工智能,自动在房间内完成地板清理工作.一般采用刷扫和真空方式,将地面杂物先吸纳进入自身的垃圾收纳盒,从而完成地 ...

  6. 4个mos管驱动的全桥电路原理_最经典MOS管电路工作原理及详解没有之一

    欢迎加入技术交流QQ群(2000人):电力电子技术与新能源 1105621549 高可靠新能源行业顶尖自媒体 在这里有电力电子.新能源干货.行业发展趋势分析.最新产品介绍.众多技术达人与您分享经验,欢 ...

  7. 简述旋转编码器的工作原理_什么是编码器,编码器工作原理介绍

    点击上方蓝色字体 机械菌 关注我们,涨知识涨见识就在这里. 正文开始 编码器(encoder)是将信号(如比特流)或数据进行编制.转换为可用以通讯.传输和存储的信号形式的设备.编码器把角位移或直线位移 ...

  8. 小牛485通讯原理_让你秒懂智能电表工作原理及抄表原理

    一.智能电表的工作原理 1.智能电表主要是由电子元器件构成,其工作原理是先通过对用户供电电压和电流的实时采样,再采用专用的电能表集成电路,对采样电压和电流信号进行处理,并转换成与电能成正比的脉冲输出, ...

  9. 简述网卡的作用和工作原理_发电机调节器的作用及工作原理

    发电机由发动带动,其转速则是由发动机转速所决定.工作时,发动机转速变化范围很大,这势必对发电机输出电压的大小有很大影响,为使发电机电压 在不同的转速下均能保持一定,且能随发电机转速的变化而自动调节,使 ...

最新文章

  1. MGM Resorts和NRG Energy在美国完成最大屋顶光伏阵列的安装
  2. OpenCV图像颜色模型转换:cvtColor函数的使用
  3. php一行多个商品,【后端开发】php一行展示多个商品怎么实现
  4. socket协议和http协议性能对比
  5. UNITY自带的3D object没有三角形?
  6. php中的几个判断文件和目录的函数 is_file() is_dir() mkdir() file_exists()
  7. SecureCRT 7.3.4 安装图解----破解图解
  8. c语言大作业酒店管理系统,管理信息系统大作业《酒店管理系统》.doc
  9. Windows下Aria2教程
  10. “黑桃A” 11月19日团队实训总结
  11. java对象 内存逃逸_JVM内存逃逸
  12. mysql mgr recovering_mysql group replication recovering 怎么调整为 online
  13. 推荐几个检索论文及代码的网站
  14. 同时使用scanf()函数和getchar()函数无法输入字符串的问题
  15. Go string类型及其使用
  16. alias linux 执行命令,Linux系统alias命令编写实现命令别名方法介绍
  17. Rodney Brooks: 我们需要更理性看待人工智能技术
  18. 0-5V转4-20mA的几种实现方法
  19. 基于java的springboot在线考试系统毕业设计springboot开题报告
  20. DFX 安全测试-- 告诉你什么是XSS、sql注入?POST和GET的区别....

热门文章

  1. goland设置Terminal
  2. 每日两SQL(10),欢迎交流~
  3. leetcode 911. Online Election | 911. 在线选举(加强堆 + 二分查找)
  4. leetcode 718. Maximum Length of Repeated Subarray | 718. 最长重复子数组(动态规划)
  5. 【Java基础】使用带有标签的break,跳出多层循环
  6. 懂集合吗?对,是dart中的集合
  7. 看动画学算法之:排序-归并排序
  8. 前端做微信好友分享_前端微信分享,调用微信分享,分享朋友圈,分享微信好友,分享qq空间,qq好友...
  9. getRealPath(““)与getRealPath(“/“)区别及用法——计算机网络相关学习笔记
  10. 【双百解法】剑指 Offer 10- I 斐波那契数列