查询数据《Expert MySQL》翻译——chapter2.解剖数据库系统(4) 查询数据

最近研究查询数据,稍微总结一下,以后继续补充:

    接上文

  查询理处

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

    部全的这些程过都须要额定的执行时间,这就求要发开这个数据库系统的人累赘起更大的任责,要将查询化优器和执行引擎的性能作为影响全局性能的素因去斟酌。这个化优程过消费资源很多,因为个一每可以互相代替的执行划计有不同的拜访数据的方法和拜访序顺,因此一条查询以可就成生无数种不同的执行划计。但是,数据库平日会用应一些现有已知的佳最实践案方来跳过种这题问。

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

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

文章结束给大家分享下程序员的一些笑话语录: 一程序员告老还乡,想安度晚年,于是决定在书法上有所造诣。省略数字……,准备好文房4宝,挥起毛笔在白纸上郑重的写下:Hello World


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值