关系型数据库工作原理-归并排序(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:《 How does a relational database work》。
原文链接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies
本文翻译了如下章节:
一、Merge Sort – 归并排序
当你需要对集合排序时,你怎么做? 什么? 你直接调用Sort()函数,…好,这是一个不错的方案。但是,对于数据库,你必须理解Sort()函数内部是如何工作的。
有很多好的排序算法,我们聚焦到最重要的一种:the merge sort。
你当前可能不理解排序的重要性,但是后面在读到查询优化章节时会理解这一点。此外,理解归并排序,也将有助于理解后面将讲到的一种数据库常用连接操作—归并连接。
二、Merge
就像许多其它有用的算法,归并排序是基于这样一种假设:将2组已经排序,大小是N/2的数据合并成在一起, 形成大小为N, 排序好的数组, 需要执行N步操作。 这些操作被称为merge。
让我们用一个简单的样例演示一下merge的过程:
从图中可以看到,构建出最终排好序有8个元素的数组,只需要遍历一次2组有4个元素的数组。因为,这两组元素都是已排好序的:
- 比较两个数组中的数据。从第一个元素开始比较。
- 将较小的数据放到排序结果数组中。
- 比较刚拿走数据的数组中的下一个元素。
- 重复1~3步,直到某个数组中的数据已拿完。
- 将另一个数组中剩余的元素放到排序结果数组中。
以上排序流程能正常执行,是因为参与排序的两个数组是有序的。在遍历数组的时候不需要往前“go back”。
现在,大家已经理解 Merge Sort的原理了。下面是它的伪代码:
array mergeSort(array a)
if(length(a)==1)
return a[0];
end if
//recursive calls
[left_array right_array] := split_into_2_equally_sized_arrays(a);
array new_left_array := mergeSort(left_array);
array new_right_array := mergeSort(right_array);
//merging the 2 small ordered arrays into a big one
array result := merge(new_left_array,new_right_array);
return result;
归并排序将一个大的问题分解为小的问题,通过找小问题的解决方法,把结果汇总起来解决最初的大问题。(备注:这类算法被称为分治法)。如果你不理解这个算法,不用担心。我第一次看到它时也不理解。我经验也许可以帮助你,我将该算法分成两个阶段:
- 分割阶段:将数组分割成更小的数组。
- 排序阶段:使用合并的方法将小的数组合并成更大的数组。
(一)Division phase – 分割阶段
在分割阶段,数组将通过3个步骤分割为更小的数组单元。用数学公式表示操作步骤数量是 log(N), N是数组中的元素数量。例如N=8,那么 log(N) = 3。
我是怎么知道的呢?
我是一个天才!哦,不…。 一句话:算法决定。其思路是每一步分割操作将原始的数组拆分为两份,操作步骤的数量就是你能将数组分割为两组数据的次数。这也是这个算法的准确定义。
(二)Sorting phase – 排序阶段
在排序阶段,你先从最小的单个数组开始排序合并。每一步,你将使用多次合并操作,总共合并次数为N=8:
- 第一步合并,先得到4组合并后的数组。每组合并使用2次操作。
- 第二步合并,得到2组合并后的数组。每组合并使用4次操作。
- 第三步合并将得到一组合并后的数组,使用8次操作。
由于执行了log(N)步,所以总的操作数是 N*log(N)。
(三)The power of merge sort – 归并排序的威力
为什么该算法如此有用?因为:
你能对算法做修改以减少内存空间的占用。换句话说,你不需要创建新的数组,直接修改原数组就可以实现排序。
备注:这种算法叫原地排序,通过调整数组中元素的位置,通过元素位置交换实现排序)。你能对算法做修改以使用磁盘空间做数据排序,只使用很少量的内存,也不会给I/O带来大的负担。其思路是每次只加载正在排序比较的数据到内存,排序后的数据写到磁盘保存。这点非常重要,当你需要对1G数据的表做排序,而你的内存只有100M时。
备注:这种算法叫外部排序。借助磁盘和内存数据交换,用有限的内存实现大数据的排序)。你可以把算法修改为支持多线程、多进程、多服务器。
例如:分布式的 merge sort是hadoop的关键组件(hadoop是一个大数据框架)。这个算法能产生真金白银(绝对的实话)。
Merge sort在大多数数据库中使用(不是所有数据库),但还有一些其它的排序算法也在使用。 如果你想了解更多,可以阅读一下相关的研究论文,它们分析了不同数据库排序算法的优劣势。
已翻译的《How does a relational database work》其它章节链接:
1. 关系型数据库工作原理-时间复杂度:http://blog.csdn.net/ylforever/article/details/51205332
2. 关系型数据库工作原理-归并排序:http://blog.csdn.net/ylforever/article/details/51216916
3. 关系型数据库工作原理-数据结构:http://blog.csdn.net/ylforever/article/details/51278954
4. 关系型数据库工作原理-高速缓存:http://blog.csdn.net/ylforever/article/details/50990121
5. 关系型数据库工作原理-事务管理(一):http://blog.csdn.net/ylforever/article/details/51048945
6. 关系型数据库工作原理-事务管理(二):http://blog.csdn.net/ylforever/article/details/51082294
关系型数据库工作原理-归并排序(翻译自Coding-Geek文章)的更多相关文章
- 关系型数据库工作原理-时间复杂度(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 关系型数据库工作原理-高速缓存(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 关系型数据库工作原理-数据结构(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 关系型数据库工作原理-事务管理(二)(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 关系型数据库工作原理-事务管理(一)(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 关系型数据库工作原理-快速缓存(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 关系型数据库工作原理-查询优化器(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...
- 关系型数据库工作原理-查询优化器之数据访问方式(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...
- 关系型数据库工作原理-查询优化器之索引(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...
随机推荐
- 使用scp从远程服务器下载文件到本地
[下载远程文件到本地] scp -P 6008 root@192.168.1.123:/usr/data/1.zip /Users/abc/www [上传本地文件到远程] scp -P 6008 ...
- mysql cp复制和mysqldump备份测试
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 备份策略 针对不同的场景下, 我们应该制定不同的备份策略对数据库进行 ...
- C/C++语言简介之发展历史
C语言之所以命名为C,是因为 C语言源自Ken Thompson发明的B语言,而 B语言则源自BCPL语言. 1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是产生了BC ...
- js内存泄露的原因
1.意外的全局变量 function fun(){ a=19//全局变量 console.log(a) } 2.未及时清理计时器或者回调函数 //记得及时清理定时器 var intervalId=se ...
- B. Pyramid of Glasses
原题链接 B. Pyramid of Glasses Mary has just graduated from one well-known University and is now attendi ...
- LOJ6000 - 「网络流 24 题」搭配飞行员
原题链接 题意简述 求二分图的最大匹配. 题解 这里写的是匈牙利算法. 表示节点的当前匹配. 为真表示在这一轮匹配中,无法给节点一个新的匹配.所以如果为真就不用再dfs它了,直接continue就好. ...
- 用pycharm+flask 建立项目以后运行出现ImportError: No module named flask-login问题
出现此问题,一般情况下: 打开CMD输入: pip install flask-login 然后,在cmd中输入命令: pip list 查看目前已安装的的模板.在此时,如果你继续运行项目,有可能会发 ...
- shiro整合ehcache
目标:让Shiro整合ehcache,提供缓存realm数据的功能. 1.引入encache配置文件,配置缓存 <!-- <ehcache xmlns:xsi="http://w ...
- home目录迁移至新分区
在用户home目录越来越大时,就可以考虑将home目录迁移至新的分区. 1.创建新分区. fidisk /dev/sda:用磁盘管理器打开磁盘 n:新建 +10g :设置分区为10G w :保存 保存 ...
- “大话架构”阿里架构师分享的Java程序员需要突破的技术要点
一.源码分析 源码分析是一种临界知识,掌握了这种临界知识,能不变应万变,源码分析对于很多人来说很枯燥,生涩难懂. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 我认为是阅读源码的最核心 ...