数据库查询优化问题笔记

首先,介绍三种联接方式,合并联接(Merge join),哈希联接(Hash Join)和嵌套循环联接(Nested Loop Join)。

合并联接:把问题拆分为小问题,通过解决小问题来解决最初的问题,分为两步:

拆分阶段,将序列分为更小的序列

排序阶段,把小的序列合在一起(使用合并算法)来构成更大的序列

嵌套循环联接(迭代,复杂度高)

针对外关系的每一行

查看内关系里的所有行来寻找匹配的行

哈希联接:

1) 读取内关系的所有元素

2) 在内存里建一个哈希表

3) 逐条读取外关系的所有元素

4) (用哈希表的哈希函数)计算每个元素的哈希值,来查找内关系里相关的哈希桶内

5) 是否与外关系的元素匹配。

 

然而,解决实际问题的过程中,会需要对查询不断的优化。

动态编程:将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。(大量数据查询时,需要附加额外的规则(或者称为启发式算法)来减少可能性)

贪婪算法:按照一个规则(或启发)以渐进的方式制定查询计划。在这个规则下,贪婪算法逐步寻找最佳算法,先处理一条JOIN,接着每一步按照同样规则加一条新的JOIN。(不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。)

例如:比如一个针对5张表(A,B,C,D,E)4次JOIN 的查询,为了简化我们把嵌套JOIN作为可能的联接方式,按照『使用最低成本的联接』规则。

直接从 5 个表里选一个开始(比如 A)

计算每一个与 A 的联接(A 作为内关系或外关系)

发现 “A JOIN B” 成本最低

计算每一个与 “A JOINB” 的结果联接的成本(“A JOIN B” 作为内关系或外关系)

发现 “(A JOIN B)JOIN C” 成本最低

计算每一个与 “(AJOIN B) JOIN C” 的结果联接的成本 ……

最后确定执行计划 “( ((A JOIN B) JOIN C) JOIN D ) JOIN E )”

因为我们是武断地从表 A 开始,我们可以把同样的算法用在 B,然后 C,然后 D, 然后 E。最后保留成本最低的执行计划。

也可以叫【最近邻居算法】,属于启发式算法中一员。

启发式算法:算法根据特定规则,一步步的应用规则但不总是保留上一步找到的最佳方法。它们统称启发式算法

例如PostGreSQL中用的基因算法:

一个方法代表一种可能的完整查询计划

每一步保留了 P 个方法(即计划),而不是一个。

0) P 个计划随机创建

1) 成本最低的计划才会保留

2) 这些最佳计划混合在一起产生 P 个新的计划

3) 一些新的计划被随机改写

4) 1,2,3步重复 T 次

5) 然后在最后一次循环,从 P 个计划里得到最佳计划。

例如SQLite中用的最近邻居算法

 

以上是我在看数据库原理(http://blog.jobbole.com/100349/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io)做的关于数据库查询优化方面的简单笔记,如果有兴趣研究数据库原理的,可以看下这篇文章,文章很长,但很有料。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值