热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

《ExpertMySQL》翻译chapter2.解剖数据库系统(4)_MySQL

《ExpertMySQL》翻译——chapter2.解剖数据库系统(4)
bitsCN.com

接上文

  查询处理

  在一个基于C/S模型的数据库系统中,数据库服务端必须根据客户端提出的请求来返回相应的数据。有个专业术语“查询传递”(query shipping)可用来描述这种通过传递查询来获得返回数据的情况。这种做法的好处在于:相对于将查询放在本地来使用有限资源去执行,将查询传递出去能够更加减少客户端间的数据交流,同时也防止了溢出的可能性。还有一个好处就是将数据的访问和检索操作与拿到数据后的处理过程做了分隔。也就是说,C/S模式能够使数据独立。

  数据独立性是Codd在上世纪70年代的论文《The separation of the physical implementation from the logical implementation》中提出的关于关系模型的一个主要优势。根据Codd的说法:

  拥有大数据的用户没必要知道数据是如何组织的......当内部数据的呈现机制改变的时候,大多数应用以及用户最终的活动应该不受其影响。

  这种分隔使得强大的业务逻辑能够独立于具体的物理实现。数据独立的目标在于将逻辑数据与其物理实现分隔开。比如说,数据在逻辑层面上如何与各表各列产生关系是完全跟这个数据在存储层面上如何存储相独立的。

  将数据独立之后,带来的一个挑战就是数据库程序就要分成两个部分去实现。第一部分是关于逻辑查询,这部分用来描述查询语句应该要干什么。第二部分就是关于物理实现,也就是怎么将逻辑查询需要的数据展示出来。

  逻辑查询可以有很多种实现方法,比如说使用类似SQL这样的高层语言,也可以使用基于某种代数系统的查询树。举个例子,在传统关系模型中,一个逻辑查询可以被描述成关系型积分(relational calculus)或者关系型代数(relational algebra)。当我们关注于需要服务器计算的东西的时候,关系型积分在这方面比较好。而关系型代数,更加关注于提供一个算法,能够让你找到你需要查询的东西,然而,在计算这个查询的时候所需要的更多其他细节(也就是关系型积分偏重的部分)依旧还需要进行额外处理。

  物理实现则是可以被数据库引擎理解并执行的一个查询树。所谓的查询树就是这样的一个树结构:每一个节点都包含一个查询时需要的计算符号(可以简单理解为加减乘除、逻辑判断、求笛卡尔积等一些计算符号),然后这个节点的孩子们就是参与这个计算符号运算的所有表。这个查询树通过优化器可以转换为查询的执行计划。这个执行计划可以理解为能够被执行查询的引擎所理解的一段程序。

  一条查询在被执行之前还会经过几个过程:分析、验证、优化、执行计划的生成和编译,然后就是执行。图2-2描述了一个典型数据库系统针对查询的处理流程。每个查询语句都会在解析之后进行验证,然后检查一下语法是不是对,以及辨别一下是哪种查询操作。然后这个分析器就会生成一个“中间表述”来交给优化器,最终形成一个经过优化的执行计划。然后引擎就会执行这些查询,最终将结果返回给客户端。这一过程在图2-2中有描述:当分析结束之后,就会检查是否有错误,没错误之后就开始优化,然后生成一个计划并且编译这个计划,然后这个查询就被执行了。(特喵的这个还真的不是我翻译的罗嗦,原文就这么罗嗦,同样的概念讲了两遍。。。)

  第一步是将逻辑查询通过关系型代数(relational algebra)从SQL转换为一个查询树。这一步是通过分析器完成的,而且通常情况下,分析器会将SQL拆解,然后再组装成为查询树。下一步就是把这个基于逻辑代数的查询树翻译成一个查询计划。通常来说,一个查询树可以翻译成很多种查询计划,寻找最佳查询计划的这个过程就叫做查询优化。也就是说我们希望获得一个最优的查询计划,使得在将来的性能测试(比如说测试一下执行时间)中表现较好。也就是在优化器能力范围内能够搜索到的所有查询计划中,找一个最优或者次优的查询计划来工作。优化器开始的时候是将基于关系型代数的查询树复制到自己的搜索范围内,然后在有限迭代的情况下不断生成查询计划来扩展自己的搜索范围,直到找到最优的为止。

  在这一层次上,优化器通常可以被看作是SQL语言编译器的一个代码生成器。事实上,在有些数据库系统中,编译这一步就可以将查询转换成一个可执行程序。但是,大多数数据库系统通常是把查询翻译成一种在执行阶段可以被数据库系统的内建库函数执行的形式。在这种情况下,代码编译的过程给查询执行引擎提供代码,除非优化器真的很强大,能够生成非常有效率的代码。举个例子,优化器需要使用数据库系统的目录来获得相关信息,这些信息包括查询中涉及的数据库中存储的关系等,然而一个传统的编译器通常不做这事,所以优化器生成的代码只要能够被引擎理解就好了。最终,优化器将经过优化的执行计划从它的内存结构中复制出来,提交给查询执行引擎。然后查询执行引擎使用数据库中已经存储的数据关系作为输入,来跑这个执行计划,然后生成符合查询要求的表单。

  全部的这些过程都需要额外的执行时间,这就要求开发这个数据库系统的人负担起更大的责任,要将查询优化器和执行引擎的性能作为影响全局性能的因素去考虑。这个优化过程消耗资源很多,因为每个可以互相替代的执行计划有不同的访问数据的方式和访问顺序,因此一条查询就能够生成无数种不同的执行计划。但是,数据库通常会使用一些现有已知的最佳实践方案来跳过这种问题。

  另外,导致生成一大堆执行计划的原因也在于优化器需要获得各种不同的运行时参数,然而这些参数在优化过程中又不能够真切地获得。因此,数据库系统在数据库内容中(比如在关系型的属性中赋一些值),在物理表中(比如一些索引类型),在系统参数中(比如说可用的缓存区数量),以及查询语句中涉及的常数都做了一些假设。

(小节完,全文未完待续)

bitsCN.com
推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 使用Numpy实现无外部库依赖的双线性插值图像缩放
    本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ... [详细]
  • 非公版RTX 3080显卡的革新与亮点
    本文深入探讨了图形显卡的进化历程,重点介绍了非公版RTX 3080显卡的技术特点和创新设计。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 邮件(带附件,模拟文件上传,跨服务器)发送核心代码1.测试邮件发送附件接口***测试邮件发送附件*@parammultipartFile*@return*@RequestMappi ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
author-avatar
Oo输不掉的气质
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有