首页 数据库 mysql教程 数据库sql select查询的工作原理

数据库sql select查询的工作原理

Nov 24, 2016 am 11:35 AM
mysql mysql数据库

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

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

2094.jpg

    

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

DBCCDROPCLEANBUFFERS

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

DBCCFREEPROCCACHE

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

DBCCFREESYSTEMCACHE

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

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

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

确保SQL语法正确;

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

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


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

sql server怎么用sql语句创建表 sql server怎么用sql语句创建表 Apr 09, 2025 pm 03:48 PM

在 SQL Server 中使用 SQL 语句创建表的方法:打开 SQL Server Management Studio 并连接到数据库服务器。选择要创建表的数据库。输入 CREATE TABLE 语句,指定表名、列名、数据类型和约束。单击执行按钮创建表。

sql语句三个表连接怎么写教程 sql语句三个表连接怎么写教程 Apr 09, 2025 pm 02:03 PM

本文介绍了一种使用 SQL 语句连接三个表的详细教程,指导读者逐步了解如何有效地关联不同表中的数据。通过示例和详细的语法讲解,本文将帮助您掌握 SQL 中表的连接技术,从而能够高效地从数据库中检索关联信息。

sql语句insert怎么用 sql语句insert怎么用 Apr 09, 2025 pm 06:15 PM

SQL INSERT 语句用于将数据插入表中。步骤包括:指定目标表列出要插入的列指定要插入的值(值的顺序需与列名对应)

mysql:简单的概念,用于轻松学习 mysql:简单的概念,用于轻松学习 Apr 10, 2025 am 09:29 AM

MySQL是一个开源的关系型数据库管理系统。1)创建数据库和表:使用CREATEDATABASE和CREATETABLE命令。2)基本操作:INSERT、UPDATE、DELETE和SELECT。3)高级操作:JOIN、子查询和事务处理。4)调试技巧:检查语法、数据类型和权限。5)优化建议:使用索引、避免SELECT*和使用事务。

不同数据库系统添加列的语法有什么区别 不同数据库系统添加列的语法有什么区别 Apr 09, 2025 pm 02:15 PM

不同数据库系统添加列的语法为:mysql:alter table table_name add column_name data_type; postgresql:alter table table_name添加column_name data_type; oracle; oracle:alter table table_name add(column_name data_type)

SQL注入怎么判断 SQL注入怎么判断 Apr 09, 2025 pm 04:18 PM

判断 SQL 注入的方法包括:检测可疑输入、查看原始 SQL 语句、使用检测工具、查看数据库日志和进行渗透测试。检测到注入后,采取措施修补漏洞、验证补丁、定期监控、提高开发人员意识。

SQL删除行后如何恢复数据 SQL删除行后如何恢复数据 Apr 09, 2025 pm 12:21 PM

直接从数据库中恢复被删除的行通常是不可能的,除非有备份或事务回滚机制。关键点:事务回滚:在事务未提交前执行ROLLBACK可恢复数据。备份:定期备份数据库可用于快速恢复数据。数据库快照:可创建数据库只读副本,在数据误删后恢复数据。慎用DELETE语句:仔细检查条件,避免误删数据。使用WHERE子句:明确指定要删除的数据。使用测试环境:在执行DELETE操作前进行测试。

如何在SQL图形化工具中添加列? 如何在SQL图形化工具中添加列? Apr 09, 2025 pm 12:54 PM

在SQL图形化工具中添加列:选择要添加列的表。右键单击并选择“Alter Table”或类似选项。定义新列的属性(名称、数据类型、长度、是否为空)。指定新列的默认值(如果适用)。选择适当的数据类型以避免数据错误。使用有意义的列名。考虑对大表执行添加列操作时的性能影响。在操作前始终备份数据库,以防止数据丢失。

See all articles