返回顶部
首页 > 资讯 > 数据库 >MySQL和PostgreSQL在多表连接算法上的差异有哪些
  • 109
分享到

MySQL和PostgreSQL在多表连接算法上的差异有哪些

2024-04-02 19:04:59 109人浏览 八月长安
摘要

这篇文章主要介绍Mysql和postgresql在多表连接算法上的差异有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!我们知道mysql没有hash join,也没有merge

这篇文章主要介绍Mysqlpostgresql在多表连接算法上的差异有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

我们知道mysql没有hash join,也没有merge join,所以在连接的时候只有一种算法nest loop join,nl join使用驱动表的结果集作为外表到内表中查找每一条记录,如果有索引,就会走索引扫描,没有索引就会全表扫。

nl join并不能适用所有场景,例如两个表都是很大的表的等值连接,这种场景是hash join所擅长的,而且是生产环境中最常见的场景。mysql在这个时候就显得力不从心,所以在使用mysql时我们可能会制定如下规范:禁止使用大表连接。这也是mysql永远的痛。不过据说8.0版本已经将hash join作为一个需求纳入了,我们拭目以待吧。

相比起来,postgresql的优化器十分的强劲。支持了hash join、nest loop、sort merge join,扫描算法支持seq scan、index scan、index only scan,同时还支持堆内元组技术(HOT)。在postgresql11版本中还加入了并行扫描,亲测在两张大表(一张1.6亿一张256万数据,均无索引)做join结果集300多万,pg开启并行大概20s以内就跑出结果,强于其他数据库

上面讨论了两表join的算法,下面看看多表join时mysql和pg是如何处理的。多表join其实涉及到一个问题:如何找到代价最小的最优路径。为什么会有这个问题呢?因为在多表连接时,每两个表之间连接具有一个代价值,优化器会根据代价估算调整不同表join的顺序,最后算出一个最优或者近似最优代价,使用这个代价生成执行计划,这样就涉及到图论中的最短路径问题,不同的连接顺序组合代表了图的遍历,最优代价其实就是求无源图的最短路径问题。我们知道两种主流的最短路径算法是迪杰斯特拉(Dijkstra)算法和弗洛伊德(floyd)算法,这两种算法也是动态规划中的经典算法。

在mysql中计算最优代价使用贪心算法,而pg使用的是动态规划。

Mysql:

Mysql连接使用贪心算法,下面这个图表明了贪心算法的过程:

MySQL和PostgreSQL在多表连接算法上的差异有哪些 

贪心算法的前提是确定源点,算法思想也和名字很像,只找当前步骤的最优解,是一种深度优先的解法,算法复杂度是O(n²)找到后继续深入下一层,直至达到终点。比如上图从A到G,使用贪心算法的路径是A->B->D->G算法,代价是1+2+6=9,很明显这并不是最优解,最优解我们肉眼可以看出来是A->C->F->G,代价是2+3+1=6。所以我们看贪心算法并不是全局最优的,但是优点是算法复杂度低,mysql可能也是基于这种考虑而使用贪心算法,不想将时间都浪费在计算代价上了,因为如果关联的表特别多,那么代价的计算是指数级增长,所以贪心算法虽然不是最优解,但是在连接表的数量很大的情况下具有一定优势。

Postgresql:

再来看看pg使用的动态规划,动态规划解决的是无源最短路径问题,我们想象一下其实多表连接本身就是一个无源最短路径问题,只是mysql在进行连接的时候随机选了一个作为起点而已。

动态规划的思想是将问题分解为子问题,将问题递推为子问题进行解决。以floyd算法为例。算法使用邻接矩阵来表示每个点之间的距离,如果没有连线,则代表无穷大。比如下面这个图:

MySQL和PostgreSQL在多表连接算法上的差异有哪些

 

弗洛伊德算法使用矩阵记录节点直接距离,它的强大之处在于它经过若干次计算后得到任意两个节点直接的最短距离,是真正意义上的无源最短路径算法,但是它的算法复杂度也比较高,是O(n³)。下面介绍一下该算法,算法的核心思想是如果a[ij]>a[ik]+a[kj],那么a[ij]=a[ik]+a[kj],对于每两个节点ab之间的距离,如果存在第三个中间节点c使得acb的距离更短,那么ab的距离使用acb代替,并更新到矩阵。这样的遍历过程我们大致就理解了需要三层循环,里面的两层循环是对于ab、ac、ad...de总共(n-1)*(n-1)种选择(自己对自己的距离不用计算)计算每个中间节点(最外层循环)的距离是否更小。矩阵计算过程如下:

MySQL和PostgreSQL在多表连接算法上的差异有哪些

对于第一行,依次计算ab,ac,ad,ae的距离是否有第三个节点进行替换,对于ab计算发现,ab<ac+cb&&ab<ad+db&&ab<ae+eb,所以ab不用更新,同理ac也不用更新,对于ad,计算得到ab+bd=6,ac+cd=∞,ae+ed=∞,于是更新ad=6,同理计算更新ae=8;然后依次计算下面几行。全部遍历完,经历了三层循环,算法复杂度是O(n³)。pg使用该算法能够得到最优执行计划,但是在表的个数很多时计算代价所付出的代价也很大。

以上是“MySQL和PostgreSQL在多表连接算法上的差异有哪些”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL和PostgreSQL在多表连接算法上的差异有哪些

本文链接: https://lsjlt.com/news/62543.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL和PostgreSQL在多表连接算法上的差异有哪些
    这篇文章主要介绍MySQL和PostgreSQL在多表连接算法上的差异有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!我们知道mysql没有hash join,也没有merge ...
    99+
    2024-04-02
  • jquery和javascript在语法上有哪些差异
    这篇文章主要介绍“jquery和javascript在语法上有哪些差异”,在日常操作中,相信很多人在jquery和javascript在语法上有哪些差异问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操...
    99+
    2024-04-02
  • MySQL与Oracle在SQL语句写法上有哪些差异
    下面讲讲关于MySQL与Oracle在SQL语句写法上有哪些差异,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完MySQL与Oracle在SQL语句写法上有哪些差异这篇文章你一定...
    99+
    2024-04-02
  • MySQL 5.7和MySQL 8.0的细节差异有哪些
    本篇内容主要讲解“MySQL 5.7和MySQL 8.0的细节差异有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL 5.7和MySQL 8.0的细...
    99+
    2024-04-02
  • 从python2.7和python3.0的语法差异有哪些
    本篇内容介绍了“从python2.7和python3.0的语法差异有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、基本语法pytho...
    99+
    2023-06-04
  • mysql表的连接查询有哪些?
    小编给大家分享一下mysql表的连接查询有哪些?,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql表的连接查询有:1、交叉...
    99+
    2024-04-02
  • mysql表连接的方式有哪些
    MySQL表连接的方式有以下几种:1. 内连接(INNER JOIN):返回两个表中匹配的行。只有在连接条件为真的情况下,才返回行。...
    99+
    2023-08-11
    mysql
  • 在编程算法方面,ASP 和 Linux 的差异在哪里?
    在编程算法方面,ASP 和 Linux 都是非常流行的开发平台。虽然它们都提供了许多编程工具和库,但在某些方面仍然存在差异。本文将探讨 ASP 和 Linux 在编程算法方面的不同之处。 ASP 和 Linux 的编程语言 ASP 使用 V...
    99+
    2023-08-01
    linux load 编程算法
  • oracle表连接的方法和类型有哪些
    这篇文章主要讲解了“oracle表连接的方法和类型有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“oracle表连接的方法和类型有哪些”吧!一、表连接就...
    99+
    2024-04-02
  • MySQL的连接方式和多表查询方法
    本篇内容主要讲解“MySQL的连接方式和多表查询方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL的连接方式和多表查询方法”吧!目录MySQL 内连接、左连接、右连接、外连接、多表查询...
    99+
    2023-06-20
  • mysql突然连接不上的原因有哪些
    MySQL连接不上的原因可能有以下几种:1. 服务器故障:服务器宕机、网络故障、硬件故障等情况都可能导致MySQL无法连接。2. M...
    99+
    2023-10-18
    mysql
  • MySQL远程连接不上的原因有哪些
    MySQL远程连接不上的原因可能包括以下几点: 未正确配置MySQL服务器允许远程连接。需要在MySQL服务器的配置文件中(一般...
    99+
    2024-04-18
    MySQL
  • mysql中全连接的用法有哪些
    在MySQL中,全连接(Full Join)是一种用于同时返回两个表中所有匹配和不匹配的记录的连接查询操作。全连接操作可以通过以下几...
    99+
    2023-08-16
    mysql
  • mysql多表查询的方法有哪些
    在 MySQL 中,进行多表查询有以下几种方法: 使用 INNER JOIN:使用 INNER JOIN 关键字可以将两个或多个表...
    99+
    2024-03-06
    mysql
  • mysql多表联查的方法有哪些
    MySQL多表联查的方法有以下几种: INNER JOIN:内连接,只返回两个表中共有的数据行。 LEFT JOIN:左连接,返回...
    99+
    2024-04-09
    mysql
  • C++ 函数异常处理在不同编译器实现上的差异有哪些?
    c++++函数异常处理在不同编译器中存在差异:异常抛出和捕获:大部分编译器使用throw抛出异常,用try-catch块捕获。gcc还支持__attribute__((nothrow))...
    99+
    2024-04-15
    c++ 函数异常处理
  • MySQL数据库连接不上的原因有哪些
    MySQL数据库连接不上的原因可能有以下几种: 服务器未运行:检查 MySQL 服务器是否已启动。 服务器不在运行的端口:默认 M...
    99+
    2024-04-09
    MySQL
  • MySql的回顾四:多表查询上(等值连接/非等值连接/自连接)-1992语法
           时光在不经意间,总是过得出奇的快。小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,...在外面被太阳照顾的人们啊,你们都是勤劳与可爱的人啊。在房子里已各种姿势看我这篇这章的你,既然点了进来,那就由我继续带你回顾M...
    99+
    2022-03-23
    MySql的回顾四:多表查询上(等值连接/非等值连接/自连接)-1992语法
  • 有哪些Oracle表连接方式的优化方法
    有哪些Oracle表连接方式的优化方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在Oracle数据库中,两个表之间的表连接方法有排序合...
    99+
    2024-04-02
  • MySQL中JOIN连接的基本用法有哪些
    这篇文章主要介绍“MySQL中JOIN连接的基本用法有哪些”,在日常操作中,相信很多人在MySQL中JOIN连接的基本用法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL中JOIN连接的基本用法...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作