数据库查询优化引擎可以怎样实现查询优化---物理查询优化

前一节介绍了逻辑优化,包括语义上的优化等,体现在等价的结果集的基础上,是的执行时间最短,使用建立索引的条件查询来实现等。这节就开始从物理的层面优化,物理层面的优化就体现在算法,以及索引。

单标扫描算法

这里的扫描算法也是需要结合索引来说,如果没有建立索引,查询执行计划的时候就出现seqscan,如果建立了索引就出现indexscan。这里单表扫描重点在于常用的全表扫描以及局部扫描,索引扫描,行扫描,并行表扫描,组合索引扫描等,相关的含义可以参考书中的46页有详细额介绍,但是背书的环节只会在面试上用到,所以了解即可。下面重点关注索引,有关索引,作者是花了整整一章的来描述,可见其重要性。

索引

索引是为了减少IO的操作,实现更快的获取数据。一般常见的使用方式是,索引作为条件出现在WHERE ,ON ,HAVING, ORDERBY等,但是如果出现ORDERBY出现的非索引列,这时候还是seqscan来运行。或者作为连接表出现到过滤条件中。但是如果遇到!= 这种不等于操作的时候,这时候顺序扫描就比索引扫描性能要好。但是如果使用索引出现在GROUPBY的条件中,不会触发索引。同样DISTINCT的执行也是不会执行索引。

两表连接算法

两表连接的时候,优化器执行的是嵌套连接算法,基于元组块实现嵌套,一般分为嵌套循环连接,归并连接,Hash连接。简单介绍到这里,只要是需要知道两表的连接是如何产生嵌套即可。

多表连接的顺序

基本这个是反映了查询计划的形态,分为左深树,右深树,紧密树,而根据生成的树,提出了很多算法,比如由上到下的,由底向上的。其中最常用的算法就是 动态规划,这个含义在之前的文章也有介绍,现在回顾一下就是在**规则出活动最优方案,然后基于这个最优的方案的状态决策出最优解。往往都是通过把问题分解成N个子问题,然后通过获取每个子问题的最优解,依次的归并到最后一个子问题,最后这个子问题的解就是最开始的问题的解。PG就是使用这种算法做优化处理。
除了这个动态规划之外还有一个就是
贪心算法,每次对问题求解时,都会提炼出一个局部最优的方案,但是不一定是整体最优。**而Mysql就是使用这种做优化处理。
还有一种从生物学的名称得来的算法,遗传算法,可以简单的理解为动态规划的变种,通过优胜劣汰的方式获取到最优的解,作者是花了大篇幅的生物学的名词来介绍这种算法,有兴趣读者可以去了解一下。
最后要表达的是 索引的合理使用真的是写好一个sql脚本的基础。

猜你喜欢

转载自blog.csdn.net/weixin_30947631/article/details/85493231