PG vs MySQL 执行计划解读的异同点

发布于:2025-04-16 ⋅ 阅读:(30) ⋅ 点赞:(0)

常见的扫描方式

  1. Sequential Scan
  2. Index Scan
  3. Index Only Scan
  4. Bitmap Scan
  5. TID Scan
  6. Nested Loop Join
  7. Hash Join
  8. Merge Join

(1)Seq Scan
全表扫描,当数据表中没有索引,或者满足条件的数据集较大,索引扫描的成本高于全表扫描,优化器会选择使用全表扫描。

(2)Index Scan
索引扫描,查询列有索引,则直接扫描索引,不再进行全表扫描,耗费时间小于全表扫描。

(3)Index Only Scan
全索引扫描,当查询的条件都在索引中,也会走该扫描方式,不会读取表文件。

(4)Bitmap Index Scan
位图索引扫描,也是一种走索引的方式,方法是扫描索引,把满足条件的行或者块在内存中建一个位图,扫描完索引后,再跟进位图中记录的指针到表的数据文件读取相应的数据。在or、and、in子句和有多个条件都可以同时走不同的索引时,都可能走Bitmap Index Scan。

(5)TID Scan
查找谓词中有TID。(CTID是一个系统列,用于标识某一元组位于哪个位置,由(block number + 块内的偏移量offset)组成和oracle的rowid十分类似,TID Scan就是采用该方式扫描,直接定位)

(6)Nestloop Join
嵌套循环连接,是在两个表做连接时,从一张表中读取数据(驱动表outer table),然后访问另一张表(被查找表 inner table,通常有索引)。驱动表中的每一行与inner表中的相应记录JOIN。

这个方式和mysql的SNLJ一样的原理。
NLJ (Nested Loop Join)是一种最简单的连接算法,每条外部关系的记录与每条内部关系的记录相匹配。

(7)Hash Join
散列连接,是优化器做大数据集连接时的常用方式,优化器使用两个表中较小的表(通常是小一点的那个表或数据源)利用连接键(JOIN KEY)在内存中建立散列表,将列数据存储到hash列表中,然后扫描较大的表,同样对JOIN KEY进行HASH后探测散列表,找出与散列表匹配的行。需要注意的是:如果HASH表太大,无法一次构造在内存中,则分成若干个部分,写入磁盘的临时文件,会多一个写的代价,降低效率。

(8)Merge Join
排序合并连接,是先将关联表的关联列各自做排序,然后从各自的排序表中抽取数据,到另一个排序表中做匹配。

PostgreSQL支持多种与规划器相关的配置,这些配置可用于提示查询优化器不要选择某些特定类型的连接方法。如果优化器选择的连接方法不是最优的,那么可以关闭这些配置参数,以强制查询优化器选择不同类型的连接方法。默认情况下,所有这些配置参数都是开启的。下面是对于特定连接方法的规划器配置参数:

  • enable nestloop:对应Nested Loop Join
  • enable hashjoin:对应Hash Join
  • enable mergejoin:对应Merge Join

引用文章来自:PG vs MySQL 执行计划解读的异同点 - 墨天轮


网站公告

今日签到

点亮在社区的每一天
去签到