MySQL和PostgreSQL的Explain的使用方法
首先
我是HRBrain株式会社的工程师。我已经做工程师工作近6年了。在这期间,我有5年以上的MySQL工作经验。目前,我所在的HRBrain公司主要使用PostgreSQL作为主要数据库。在使用PostgreSQL期间,当执行Explain功能时,我发现其与MySQL显示内容完全不同。因此,我将分别解释MySQL和PostgreSQL的Explain所显示的执行计划。
解释是指通过描述或说明,使某事或某个概念变得更清晰或更容易理解的行为。
显示SQL查询执行计划的功能。
可以查看查询规划器执行查询的方式,
可用于优化查询性能等操作。
只需在执行查询的开头加上Explain即可执行。
提前准备
关于如何解释(Explain)查询。
我在PostgreSQL和MySQL中分别创建了以下表格。
-
- users: ユーザ情報
-
- department: 部署情報
- orders: 注文情報
实体关系图

我们将使用以下查询来查看MySQL和PostgreSQL的Explain详细信息。
EXPLAIN
SELECT
users.name,
department.name AS department_name,
COUNT(orders.id) AS order_count
FROM
users
JOIN department ON users.department_id = department.id
LEFT JOIN orders ON users.id = orders.user_id
WHERE
users.age > 25
GROUP BY
users.id,
department.id;
如何查看执行计划
MySQL查询的结果

MySQL的Explain功能将执行计划以表格形式显示出来。
项目说明

解釈基於結果的查詢執行計劃視角。
-
- users表
由于类型为ALL,users表将进行全表扫描(读取所有行)
possible_keys显示有一个名为department_id的索引,但是key中没有显示任何东西,所以索引没有被使用
rows为10,表示users表中总共有10行数据
筛选条件被应用到的行的比例为33.3%
department表
由于类型为eq_ref,使用了索引进行等值连接(*1)
sample.users.department_id和department.id作为连接条件
rows为1说明,当连接sample.users.id和orders.user_id时,结果生成了1行
筛选条件被应用到的行的比例为100%
orders表
由于类型为ref,使用了索引进行范围连接
sample.users.id和orders.user_id作为连接条件
当连接sample.users.id和orders.user_id时,orders生成了一行
查询执行处理了5行
筛选条件被应用到的行的比例为100%
需要从表格中读取执行顺序。
PostgreSQL的结果

PostgreSQL的解释与MySQL的Explain显示完全不同。
PostgreSQL的解释以树状形式显示执行计划,并且每个节点都与父节点和子节点相关联。
我們將查看顯示的內容項目。
项目说明

解釋基於結果的查詢執行計劃的觀點。
阅读PostgreSQL执行计划的规则有以下两个。
-
- 按顺序遍历子节点,从最遥远的子孙节点开始执行,然后向上追溯至父节点。
- 如果存在兄弟元素(※2),则按照先前的行进行依次遍历节点。
为了更容易理解,我们将执行计划绘制成图表。

-
- 扫描orders表的数据
-
- 扫描users表的数据
-
- 创建用于与orders表进行连接的散列表
-
- 扫描department表
-
- 将orders表和users表进行散列连接
-
- 创建用于将department表和users表连接的散列表
-
- 将department表和users表进行散列连接
- 按user.id和department.id进行分组
这里明确显示了执行顺序和查询成本等。
总结
MySQL 是一种开源的关系型数据库管理系统。
-
- MySQLのExplainの表示は12の項目で実行計画が表示される。
- 表示された12項目の内容を読み取り実行順序を読み取る必要がある。
PostgreSQL可以被简单地理解为一种数据库管理系统。
-
- QUERY PLANというテキスト形式で出力される。
-
- 項目は実行したクエリにより内容が変わる。
-
- 実行計画の予測cost等を出してくれる。
-
- 実行順序はツリー形式で明示的に表示され、親ノードと子ノードの関係が明確に示される。
- クエリのコストや結合順序などの詳細情報が提供される。
通过使用 Explain 功能来查看执行计划的内容,重新考虑索引的使用方法和查询条件,以确认是否可以创建更高性能的查询。
个人观点
PostgreSQL Explain的显示方式与MySQL完全不同,但一旦理解了含义,查询的执行计划就会明确地显示出来,让人非常容易理解。
填补
※1:等值搜索指的是在连接条件中,两个表的列之间通过相等的值进行连接。
※2:兄弟元素指的是在解释中具有相同父节点并在同一层级显示的节点。在示例中,Hash Right Join是父节点,Seq Scan on orders和Hash是兄弟关系。
可以参考:
-
- MySQL 8.0 リファレンスマニュアル
-
- USE THE INDEX, LUKE!
-
- 【PostgreSQL】Explainの見方(analyze , cost , scan , sort)についてのまとめ
- 【PostgreSQL】初心者でも読める実行計画の基礎知識