SlideShare a Scribd company logo
MySQLとPostgreSQLの基本的な実行プラン比較
Compared Version
MySQL PostgreSQL
root@localhost [mysql]> select @@version,now();
+-----------+---------------------+
| @@version | now() |
+-----------+---------------------+
| 8.0.19 | 2020-05-01 22:57:16 |
+-----------+---------------------+
1 row in set (0.00 sec)
postgres=# select version(),now();
PostgreSQL 12.2 on x86_64-pc-linux-gnu,
compiled by gcc (GCC) 4.8.5 20150623 (Red Hat
4.8.5-39), 64-bit | 2020-05-02
08:37:59.159713+09
PostgreSQL 12.2 Release date: 2020-02-13
https://www.postgresql.org/docs/12/release-12-2.html
MySQL 8.0.19 Release date: 2020-01-13
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-19.html
STATISTICS FOR MAKING PLAN
MySQL PostgreSQL
[mysql]> select * from innodb_table_stats where table_name = 'memo'G
*************************** 1. row ***************************
database_name: confirm
table_name: memo
last_update: 2020-05-02 02:18:49
n_rows: 10
clustered_index_size: 1
sum_of_other_index_sizes: 0
1 row in set (0.00 sec)
[mysql]> select * from innodb_index_stats where table_name = 'memo'G
*************************** 1. row ***************************
database_name: confirm
table_name: memo
index_name: PRIMARY
last_update: 2020-05-02 02:18:49
stat_name: n_diff_pfx01
stat_value: 10
sample_size: 1
stat_description: id
app=# SELECT relpages, reltuples, reltuples/relpages as pagedata
app-# FROM pg_class WHERE relname = 'memo';
relpages | reltuples | pagedata
----------+-----------+--------------------
74 | 10000 | 135.13513513513513
(1 行)
app=# SELECT tablename,attname,correlation, inherited, n_distinct,
array_to_string(most_common_vals, E'n') as most_common_vals
FROM pg_stats
WHERE tablename = 'memo';
-[ RECORD 1 ]----+-------------
tablename | memo
attname | id
correlation | 1
inherited | f
n_distinct | -1
most_common_vals |
-[ RECORD 2 ]----+-------------
tablename | memo
attname | data
correlation | 1
inherited | f
n_distinct | 1
most_common_vals | Fragment
innodb_stats_persistentの設定、ANALYZE,DDL,その他の処理により更新されます。
InnoDB は、オプティマイザがもっとも効率的なクエリー実行計画を容易に見つけることができる
ように、InnoDB テーブルごとの統計を保持しています。
参照:https://dev.mysql.com/doc/refman/8.0/en/innodb-persistent-stats.html
https://dev.mysql.com/doc/refman/5.6/ja/innodb-analyze-table-complexity.html
VACUUM、ANALYZE、CREATE INDEXなどの一部のDDLコマンドによって更新されます。
問い合わせプランナは、より良い問い合わせ計画を選択するために問い合わせによって取り出され
る行数の推定値を必要としています。
参照:https://www.postgresql.jp/document/11/html/planner-stats.html
https://github.com/postgres/postgres/blob/master/src/include/catalog/pg_statistic.h
列 値 為
値
行数 程認識
行数 程認識
STATISTICS FOR MAKING PLAN
MySQL PostgreSQL
[root@localhost [mysql]> show global variables like 'innodb_stats_%';
+--------------------------------------+-------------+
| Variable_name | Value |
+--------------------------------------+-------------+
| innodb_stats_auto_recalc | ON |
| innodb_stats_include_delete_marked | OFF |
| innodb_stats_method | nulls_equal |
| innodb_stats_on_metadata | OFF |
| innodb_stats_persistent | ON |
| innodb_stats_persistent_sample_pages | 20 |
| innodb_stats_transient_sample_pages | 8 |
+--------------------------------------+-------------+
root@localhost [confirm]> analyze table memo;
+--------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------+---------+----------+----------+
| confirm.memo | analyze | status | OK |
+--------------+---------+----------+----------+
1 row in set (0.00 sec)
-bash-4.2$ cat postgresql.conf | grep -e autovacuum_vacuum_threshold -e
autovacuum_analyze_scale_factor
#autovacuum_vacuum_threshold = 50 # min number of row updates before
#autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze(10%)
-bash-4.2$
app=# select name,setting,unit,context,category,short_desc from pg_settings where name like
'%statistics%';
-[ RECORD 1 ]---------------------------------------------------
name | default_statistics_target
setting | 100
unit |
context | user
category | 問い合わせのチューニング / その他のプランオプション
short_desc | デフォルトの統計情報収集目標を設定。
app=# analyze verbose memo;
INFO: "public.memo"を解析しています
INFO: "memo": 809ページの内809をスキャン。110000の有効な行と0の不要な行が存在。
30000行をサンプリング。推定総行数は110000
ANALYZE
app=#
バックグラウンドで行われる自動統計再計算の非同期性の為、innodb_stats_auto_recalcが有効に
なっている場合でも、テーブルの10%以上に影響するDML操作の実行後であっても統計がすぐに再計
算されない場合があります。直ぐに統計情報を更新したい場合は、ANALYZEを実行。
その他、ALTER TABLEコマンドでフラグメントと統計を解消する方法として以下のコマンドを実行。
"ALTER TABLE <テーブル名> engine = innodb ,ALGORITHM=INPLACE,LOCK=NONE;"
参照: https://dev.mysql.com/doc/refman/8.0/en/innodb-persistent-stats.html
メモ: During the analysis, the table is locked with a read lock for InnoDB and MyISAM.
テーブル全体の10%のデータ+50行が更新されたタイミングで統計情報が更新される。
ANALYZEによりpg_statisticに格納される情報量、具体的には、それぞれの列に対する
most_common_vals内とhistogram_bounds配列のエントリの最大数は、
ALTER TABLE SET STATISTICSコマンドによって列ごとに、default_statistics_target設定
パラメータを設定することによってグローバルに設定することができます。
参照:https://www.postgresql.jp/document/11/html/planner-stats.html
行 超 大幅 変更
加 場合 統計 自動計算
場合
場合
格納 配列
最大値 設定
付 事
数 設定 事 出来
*
行
COST CONTROL FOR MAKING PLAN
MySQL PostgreSQL
root@localhost [mysql]> select * from mysql.server_cost;
+------------------------------+------------+---------------------+---------+---------------+
| cost_name | cost_value | last_update | comment | default_value |
+------------------------------+------------+---------------------+---------+---------------+
| disk_temptable_create_cost | NULL | 2018-05-18 00:49:28 | NULL | 20 |
| disk_temptable_row_cost | NULL | 2018-05-18 00:49:28 | NULL | 0.5 |
| key_compare_cost | NULL | 2018-05-18 00:49:28 | NULL | 0.05 |
| memory_temptable_create_cost | NULL | 2018-05-18 00:49:28 | NULL | 1 |
| memory_temptable_row_cost | NULL | 2018-05-18 00:49:28 | NULL | 0.1 |
| row_evaluate_cost | NULL | 2018-05-18 00:49:28 | NULL | 0.1 |
+------------------------------+------------+---------------------+---------+---------------+
root@localhost [mysql]> select * from mysql.engine_cost;
+-------------+-------------+------------------------+------------+---------------------+---------+---------------+
| engine_name | device_type | cost_name | cost_value | last_update | comment | default_value |
+-------------+-------------+------------------------+------------+---------------------+---------+---------------+
| default | 0 | io_block_read_cost | NULL | 2018-05-18 00:49:28 | NULL | 1 |
| default | 0 | memory_block_read_cost | NULL | 2018-05-18 00:49:28 | NULL | 0.25 |
+-------------+-------------+------------------------+------------+---------------------+---------+---------------+
root@localhost [confirm]> SHOW GLOBAL VARIABLES like 'optimizer_switch'G
*************************** 1. row ***************************
Variable_name: optimizer_switch
Value:
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condit
ion_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_a
ccess=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materi
alization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisib
le_indexes=off,skip_scan=on,hash_join=on
[root@postgresql admin]# cat /var/lib/pgsql/12/data/postgresql.conf | grep page_cost
#seq_page_cost = 1.0 # measured on an arbitrary scale
#random_page_cost = 4.0 # same scale as above
[root@postgresql admin]#
app=# select name,setting,category from pg_settings where name like '%cost';
name | setting | category
-------------------------+---------+-----------------------------------------------
cpu_index_tuple_cost | 0.005 | 問い合わせのチューニング / プランナコスト定数
cpu_operator_cost | 0.0025 | 問い合わせのチューニング / プランナコスト定数
cpu_tuple_cost | 0.01 | 問い合わせのチューニング / プランナコスト定数
jit_above_cost | 100000 | 問い合わせのチューニング / プランナコスト定数
jit_inline_above_cost | 500000 | 問い合わせのチューニング / プランナコスト定数
jit_optimize_above_cost | 500000 | 問い合わせのチューニング / プランナコスト定数
parallel_setup_cost | 1000 | 問い合わせのチューニング / プランナコスト定数
parallel_tuple_cost | 0.1 | 問い合わせのチューニング / プランナコスト定数
random_page_cost | 4 | 問い合わせのチューニング / プランナコスト定数
seq_page_cost | 1 | 問い合わせのチューニング / プランナコスト定数
(10 行)
server_costやengine_costの値を設定する事により、実行プランを計算する時にの挙動を変更する事が
可能です。ここ数年、Flashディスク等の高速なディスクを利用する事が多も増えているので、実行プラ
ンを微調整する為の値です。またOptimizer Switch等もバージョンと共に変化しているので、
そちらも適宜調整すると良いかと思います。
参照: https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0108
シーケンシャルな一連の取り出しの一部となる、ディスクページ取り出しに関する、プランナの
推定コストを設定します。 デフォルトは1.0です。非シーケンシャル的に取り出されるディスク
ページのコストに対するプランナの推測を設定します。 デフォルトは4です。
参照: https://www.postgresql.jp/document/11/html/runtime-config-query.html
Explain (SQL Execution Plan)
root@localhost [mysql]> explain select id from memo where id = 1;
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
| 1 | SIMPLE | memo | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | Using index |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
postgresql=# explain select id from memo where id = 1;
QUERY PLAN
-----------------------------------------------------------------------------
Index Only Scan using idx_memo_id on memo (cost=0.28..8.29 rows=1 width=4)
Index Cond: (id = 1)
MySQL, PostgreSQLのANALYZEによる統計情報は厳密なものではなくランダムなサンプリングを行った結果であり、
実際の処理は実際のデータ分布、インデックス、プラットフォーム等、その他の要因にも依存します。
https://www.postgresql.jp/document/11/html/using-explain.html
https://dev.mysql.com/doc/refman/8.0/en/using-explain.html
Basic Expain
MySQL
root@localhost [confirm]> explain select id from memo where id = 1;
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
| 1 | SIMPLE | memo | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | Using index |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
root@localhost [confirm]> show warnings;
+-------+------+--------------------------------------------------------------------+
| Level | Code | Message |
+-------+------+--------------------------------------------------------------------+
| Note | 1003 | /* select#1 */ select '1' AS `id` from `confirm`.`memo` where true |
+-------+------+--------------------------------------------------------------------+
1 row in set (0.00 sec)
root@localhost [confirm]> explain for connection 38017;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE | memo | NULL | ALL | NULL | NULL | NULL | NULL | 10 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set (0.00 sec)
EXPLAIN (DESC)は、SELECT、DELETE、INSERT、REPLACE、およびUPDATEステートメントで機能します。MySQL 8.0.19以降では、
TABLEステートメントでも機能します。explainで実行プランを確認したのちに、show warningsを実行する事で、実際にMySQLの
オプティマイザが書換え最適化したSQLを確認可能です。また、explain for connectionで特定の接続の実行プランを確認する事も可能です。
Basic Expain
PostgreSQL
app=# explain select id from memo where id = 1;
QUERY PLAN
-----------------------------------------------------------------------------
Index Only Scan using idx_memo_id on memo (cost=0.28..8.29 rows=1 width=4)
Index Cond: (id = 1)
(2 行)
app=# explain analyze select id from memo where id = 1;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
Index Only Scan using idx_memo_id on memo (cost=0.28..8.29 rows=1 width=4) (actual time=0.011..0.012 rows=1 loops=1)
Index Cond: (id = 1)
Heap Fetches: 1
Planning Time: 0.046 ms
Execution Time: 0.021 ms
(5 行)
EXPLAINはSELECT,INSERT、UPDATE、DELETE、CREATE TABLE AS、EXECUTで機能します。
(cost=0.28..8.29 rows=1 width=4)
- 初期処理の推定コスト。 出力段階が開始できるようになる前に消費される時間。
- 全体推定コスト。 これは計画ノードが実行完了である、つまりすべての利用可能な行を受け取ることを前提として示される。
- 計画ノードが出力する行の推定数。rowsの値は、計画ノードによって処理あるいはスキャンされた行数を表しておらず、ノードによって発行された行数を表す。
- この計画ノードが出力する行の(バイト単位での)推定平均幅。
Expain Options
MySQL
root@localhost [confirm]> explain analyze select * from memo where id = 1G
*************************** 1. row ***************************
EXPLAIN: -> Rows fetched before execution (actual time=0.000..0.000 rows=1 loops=1)
1 row in set (0.00 sec)
root@localhost [confirm]> explain analyze select * from memo where id >= 1 and id < 10 G
*************************** 1. row ***************************
EXPLAIN: -> Filter: ((memo.id >= 1) and (memo.id < 10)) (cost=2.06 rows=9) (actual time=0.016..0.027 rows=9 loops=1)
-> Index range scan on memo using PRIMARY (cost=2.06 rows=9) (actual time=0.014..0.023 rows=9 loops=1)
1 row in set (0.00 sec)
root@localhost [confirm]> explain analyze update memo set data = 'analyze テスト' where id = 1G
*************************** 1. row ***************************
EXPLAIN: <not executable by iterator executor>
1 row in set (0.00 sec)
参考: https://dev.mysql.com/doc/refman/8.0/en/explain.html
MySQL 8.0.18はEXPLAIN ANALYZEを導入しています。EXPLAIN ANALYZEは、SELECTステートメントだけでなく、
複数テーブルのUPDATEおよびDELETEステートメントでも使用できます。 MySQL 8.0.19からは、TABLEステートメントでも使用できます。
WL#4168: Implement EXPLAIN ANALYZE
Expain Options
PostgreSQL
app=# explain (analyze on, buffers on, verbose on) select id from memo where id = 1;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------
Index Only Scan using idx_memo_id on public.memo (cost=0.28..8.29 rows=1 width=4) (actual time=0.027..0.029 rows=1 loops=1)
Output: id
Index Cond: (memo.id = 1)
Heap Fetches: 1
Buffers: shared hit=3
Planning Time: 0.084 ms
Execution Time: 0.051 ms
(7 行)
app=# explain verbose select * from memo where id = 1;
QUERY PLAN
--------------------------------------------------------------------------------
Index Scan using idx_memo_id on public.memo (cost=0.28..8.29 rows=1 width=25)
Output: id, data, data2
Index Cond: (memo.id = 1)
(3 行)
参考: https://www.postgresql.jp/document/11/html/sql-explain.html
解析でEXPLAINの出力をプログラムに渡すことを考えているのであれば、代わりに機械読み取りが容易な出力書式(XML、JSON、YAML)のいずれかを使用する事も可能です。
指定
取得 確認可能
Expain Output Format
MySQL
参考: https://dev.mysql.com/doc/refman/8.0/en/explain.html
[mysql]> explain format=TRADITIONAL select id from memo where id >= 1 and id < 10G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: memo
partitions: NULL
type: range
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: NULL
rows: 9
filtered: 100.00
Extra: Using where; Using index
1 row in set, 1 warning (0.00 sec)
root@localhost [confirm]>
[mysql]> explain format=TREE select id from memo where id >= 1 and id < 10G
*************************** 1. row ***************************
EXPLAIN: -> Filter: ((memo.id >= 1) and (memo.id < 10)) (cost=2.06 rows=9)
-> Index range scan on memo using PRIMARY (cost=2.06 rows=9)
1 row in set (0.01 sec)
[mysql]> explain format=JSON select id from memo where id = 1G
*************************** 1. row ***************************
EXPLAIN: {
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "1.00"
},
"table": {
"table_name": "memo",
<SNIP>
"using_index": true,
"cost_info": {
"read_cost": "0.00",
"eval_cost": "0.10",
"prefix_cost": "0.00",
"data_read_per_join": "16"
},
"used_columns": [
"id"
]
}
}
1 row in set, 1 warning (0.00 sec)
詳細
見積
Expain Output Format
PostgreSQL
参考: https://www.postgresql.jp/document/11/html/sql-explain.html
解析でEXPLAINの出力をプログラムに渡すことを考えているのであれば、代わりに機械読み取りが容易な出力書式(XML、JSON、YAML)のいずれかを使用する事も可能です。
app=# explain (FORMAT YAML) select id
app=# from memo where id = 1;
QUERY PLAN
----------------------------------
- Plan: +
Node Type: "Index Only Scan"+
Parallel Aware: false +
Scan Direction: "Forward" +
Index Name: "idx_memo_id" +
Relation Name: "memo" +
Alias: "memo" +
Startup Cost: 0.28 +
Total Cost: 8.29 +
Plan Rows: 1 +
Plan Width: 4 +
Index Cond: "(id = 1)"
(1 行)
app=# explain (FORMAT JSON) select id
app=# from memo where id = 1;
QUERY PLAN
---------------------------------------
[ +
{ +
"Plan": { +
"Node Type": "Index Only Scan",+
"Parallel Aware": false, +
"Scan Direction": "Forward", +
"Index Name": "idx_memo_id", +
"Relation Name": "memo", +
"Alias": "memo", +
"Startup Cost": 0.28, +
"Total Cost": 8.29, +
"Plan Rows": 1, +
"Plan Width": 4, +
"Index Cond": "(id = 1)" +
} +
} +
]
(1 行)
app=# explain (FORMAT XML) select id
app-# from memo where id = 1;
QUERY PLAN
----------------------------------------------------------
<explain xmlns="http://www.postgresql.org/2009/explain">+
<Query> +
<Plan> +
<Node-Type>Index Only Scan</Node-Type> +
<Parallel-Aware>false</Parallel-Aware> +
<Scan-Direction>Forward</Scan-Direction> +
<Index-Name>idx_memo_id</Index-Name> +
<Relation-Name>memo</Relation-Name> +
<Alias>memo</Alias> +
<Startup-Cost>0.28</Startup-Cost> +
<Total-Cost>8.29</Total-Cost> +
<Plan-Rows>1</Plan-Rows> +
<Plan-Width>4</Plan-Width> +
<Index-Cond>(id = 1)</Index-Cond> +
</Plan> +
</Query> +
</explain>
(1 行)
同義語 実際 構造 関 情報 取得 使用 多
実行 実行 方法 説明 取得 使用
指定 接続 別 属 場合 特権 必要
実行 期待 実際 実行 一致 関
追加 情報 出力 生成 次 情報 提供
推定実行 一部 考慮 推定 含 返 行 推定数 最初 行 返 時間
行 返 時間 実際 秒 複数 場合 図 平均時間 示 返 行数 数
出力形式 指定 指定可能 形式 処理
正確 説明 含 状 出力 提供
他
MySQL
実行 実際 実行時間 他 統計情報 表示
計画 追加情報 出力 具体的 計画 修飾 関数名内 各 対 出力列 含 常 範囲 別名 付
式内 変数 命名 常 統計情報 表示 各 名前 出力
各計画 推定起動 総 推定行数 各行 推定幅 関 情報 含
使用状況 関 情報 含 具体的 共有 数 読 取 数 数 書 出 数 数
数 読 取 数 書 出 数 一時 読 取 数 書 出 数 含 必要 時 内 見 読 取 避
意味 共有 通常 含 一時
含 一時 計画 使用 短期間有効 含 数 変更
問 合 変更 数 示 書 出 数 問 合 処理 間 状態 内
追 出 数 示 上位 表示 数 子 使用 含 形式
非 値 出力 有効 場合 使用
実際 時間 費 時間 追加表示 一部 何度 読 取 問 合
低速 可能性 実際 時間 実際 行数 必要 設定 方 有益 文全体 実行
時間 時間計測 無効 場合 常 計測 有効 場合
使用
要約情報 例 時間 情報 合計 問 合 計画 後 出力 要約情報 使 含 以外 場合 含
使 有効 計画時間 計画 取得 要 時間 必要 再計画
要 時間 含
出力形式 指定 指定可能 以外 出力 出力 同 情報 含 解析 容易
PostgreSQL
機能 拡張 形式 利用可能 拡張情報 使用 視覚的表現 生成 表示 事 可能
色 直感的 実行 状況 確認 事 可能
MySQL
参照
利用 形式 表形式 同様
実行計画 確認 事 可能 表示出来
MySQL
参照
Need to Know
PostgreSQL (INSERT, UPDATE, DELETE) - 使用 場合 実際 実行
app=# explain analyze delete from memo where id = 1000;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------
Delete on memo (cost=0.28..8.62 rows=2 width=6) (actual time=0.080..0.080 rows=0 loops=1)
-> Index Scan using idx_memo_id on memo (cost=0.28..8.62 rows=2 width=6) (actual time=0.020..0.023 rows=2 loops=1)
Index Cond: (id = 1000)
Planning Time: 0.086 ms
Execution Time: 0.111 ms
(5 行)
app=# select * from memo where id = 1000;
id | data | data2
----+------+-------
(0 行)
app=# explain (analyze on, buffers on) delete from memo where id = 112;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------
Delete on memo (cost=0.28..8.29 rows=1 width=6) (actual time=0.027..0.027 rows=0 loops=1)
Buffers: shared hit=4 dirtied=1
-> Index Scan using idx_memo_id on memo (cost=0.28..8.29 rows=1 width=6) (actual time=0.008..0.008 rows=1 loops=1)
Index Cond: (id = 112)
Buffers: shared hit=3
Planning Time: 0.077 ms
Execution Time: 0.082 ms
(7 行)
app=# select id from memo where id = 112;
id
----
(0 行)
使用 場合 文 実際 実行 忘
返 出力 表示 文 伴 副作用 通常通 発生
文 対
影響 与 実行 場合 以下 方法 使用
参照
※ 実際 更新
Need to Know
PostgreSQL (INSERT, UPDATE, DELETE) - 使用 場合 実際 実行
更新
実行
MySQL 5.7入門(チューニング基礎編)
https://downloads.mysql.com/presentations/20151208_02_MySQL_Tuning_for_Beginners.pdf
MySQL 8.0入門セミナー講演資料 (チューニング基礎編、SQLチューニング編)
https://www.mysql.com/jp/why-mysql/presentations/mysql-80-for-beginners-tuning-basic-sql-tuning-2020-doc-jp/
MySQL GUIツール Performance Report, Query Analyzer
https://downloads.mysql.com/presentations/20150312_03_MySQL_WB_and_MEM.pdf
MySQLのEXPLAINを徹底解説
http://nippondanji.blogspot.com/2009/03/mysqlexplain.html
PostgreSQL SQL チューニング入門
https://www.postgresql.jp/sites/default/files/2017-01/T6_ExplainingExplain_pgday2012_for_print.pdf
まずやっとく PostgreSQLのチューニング
https://dbstudychugoku.github.io/pdf/20140713_postgre_tuning.pdf
PostgreSQL 12 新機能解説
https://www.sraoss.co.jp/event_seminar/2019/PostgreSQL%2012%20%E6%96%B0%E6%A9%9F%E8%83%BD%E8%A7%A3%E8%AA%AC.pdf
詳細 見 適切 利用 ? 順番 駆動表 適切 選択
最適化 ? 結果 書 換 張 直
複合 列 順番 変更 思 対応方法 関 参考
試 頂 思

More Related Content

What's hot (20)

PostgreSQL: XID周回問題に潜む別の問題
PostgreSQL: XID周回問題に潜む別の問題PostgreSQL: XID周回問題に潜む別の問題
PostgreSQL: XID周回問題に潜む別の問題
NTT DATA OSS Professional Services
 
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSPostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVS
Noriyoshi Shinoda
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama
 
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PostgreSQLではじめるOSS開発@OSC 2014 HiroshimaPostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
Shigeru Hanada
 
Vacuum徹底解説
Vacuum徹底解説Vacuum徹底解説
Vacuum徹底解説
Masahiko Sawada
 
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
Kazuto Kusama
 
Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会
Masahiko Sawada
 
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニング
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニングしばちょう先生による特別講義! RMANバックアップの運用と高速化チューニング
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニング
オラクルエンジニア通信
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
 
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
NTT DATA Technology & Innovation
 
AWS Glueを使った Serverless ETL の実装パターン
AWS Glueを使った Serverless ETL の実装パターンAWS Glueを使った Serverless ETL の実装パターン
AWS Glueを使った Serverless ETL の実装パターン
seiichi arai
 
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイントPostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
NTT DATA OSS Professional Services
 
Topology Managerについて / Kubernetes Meetup Tokyo 50
Topology Managerについて / Kubernetes Meetup Tokyo 50Topology Managerについて / Kubernetes Meetup Tokyo 50
Topology Managerについて / Kubernetes Meetup Tokyo 50
Preferred Networks
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
Masahiko Sawada
 
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
NTT DATA Technology & Innovation
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
 
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web ServiceアプリケーションAngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
ssuser070fa9
 
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSPostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVS
Noriyoshi Shinoda
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama
 
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PostgreSQLではじめるOSS開発@OSC 2014 HiroshimaPostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
Shigeru Hanada
 
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法
Kazuto Kusama
 
Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会
Masahiko Sawada
 
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニング
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニングしばちょう先生による特別講義! RMANバックアップの運用と高速化チューニング
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニング
オラクルエンジニア通信
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
 
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
スケールアウトするPostgreSQLを目指して!その第一歩!(NTTデータ テクノロジーカンファレンス 2020 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
NTT DATA Technology & Innovation
 
AWS Glueを使った Serverless ETL の実装パターン
AWS Glueを使った Serverless ETL の実装パターンAWS Glueを使った Serverless ETL の実装パターン
AWS Glueを使った Serverless ETL の実装パターン
seiichi arai
 
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイントPostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
NTT DATA OSS Professional Services
 
Topology Managerについて / Kubernetes Meetup Tokyo 50
Topology Managerについて / Kubernetes Meetup Tokyo 50Topology Managerについて / Kubernetes Meetup Tokyo 50
Topology Managerについて / Kubernetes Meetup Tokyo 50
Preferred Networks
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
Masahiko Sawada
 
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
NTT DATA Technology & Innovation
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
 
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web ServiceアプリケーションAngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
ssuser070fa9
 

Similar to MySQLとPostgreSQLの基本的な実行プラン比較 (20)

JPUGしくみ+アプリケーション勉強会(第20回)
JPUGしくみ+アプリケーション勉強会(第20回)JPUGしくみ+アプリケーション勉強会(第20回)
JPUGしくみ+アプリケーション勉強会(第20回)
Yoshinori Nakanishi
 
20090107 Postgre Sqlチューニング(Sql編)
20090107 Postgre Sqlチューニング(Sql編)20090107 Postgre Sqlチューニング(Sql編)
20090107 Postgre Sqlチューニング(Sql編)
Hiromu Shioya
 
MySQLとPostgreSQLの基本的なパラメータ比較
MySQLとPostgreSQLの基本的なパラメータ比較MySQLとPostgreSQLの基本的なパラメータ比較
MySQLとPostgreSQLの基本的なパラメータ比較
Shinya Sugiyama
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編
Miki Shimogai
 
OOW Tokyo 2012 Unconference つまらない STATSPACK をさらにややこしく解説してみよう
OOW Tokyo 2012 Unconference つまらない STATSPACK をさらにややこしく解説してみようOOW Tokyo 2012 Unconference つまらない STATSPACK をさらにややこしく解説してみよう
OOW Tokyo 2012 Unconference つまらない STATSPACK をさらにややこしく解説してみよう
Tadashi Yamashita
 
PostgreSQL17対応版 EXPLAINオプションについて (第49回PostgreSQLアンカンファレンス@東京 発表資料)
PostgreSQL17対応版 EXPLAINオプションについて (第49回PostgreSQLアンカンファレンス@東京 発表資料)PostgreSQL17対応版 EXPLAINオプションについて (第49回PostgreSQLアンカンファレンス@東京 発表資料)
PostgreSQL17対応版 EXPLAINオプションについて (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
 
道具を磨くことのススメ
道具を磨くことのススメ道具を磨くことのススメ
道具を磨くことのススメ
Kenichi Masuda
 
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@KyotoPostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
Shigeru Hanada
 
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
Uptime Technologies LLC (JP)
 
MySQL 5.7 トラブルシューティング 性能解析入門編
MySQL 5.7 トラブルシューティング 性能解析入門編MySQL 5.7 トラブルシューティング 性能解析入門編
MySQL 5.7 トラブルシューティング 性能解析入門編
Mikiya Okuno
 
MySQLステータスモニタリング
MySQLステータスモニタリングMySQLステータスモニタリング
MySQLステータスモニタリング
yoku0825
 
いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理
Uptime Technologies LLC (JP)
 
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
Shigeru Hanada
 
PostgreSQL使いのエンジニアから見たMySQL
PostgreSQL使いのエンジニアから見たMySQLPostgreSQL使いのエンジニアから見たMySQL
PostgreSQL使いのエンジニアから見たMySQL
toshihiro_kitagawa
 
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
NTT DATA Technology & Innovation
 
MySQL 5.5 Update #denatech
MySQL 5.5 Update #denatechMySQL 5.5 Update #denatech
MySQL 5.5 Update #denatech
Mikiya Okuno
 
より深く知るオプティマイザとそのチューニング
より深く知るオプティマイザとそのチューニングより深く知るオプティマイザとそのチューニング
より深く知るオプティマイザとそのチューニング
Yuto Hayamizu
 
MySQL 開発最新動向
MySQL 開発最新動向MySQL 開発最新動向
MySQL 開発最新動向
yoyamasaki
 
PostgreSQLバックアップの基本
PostgreSQLバックアップの基本PostgreSQLバックアップの基本
PostgreSQLバックアップの基本
Uptime Technologies LLC (JP)
 
PostgreSQLの関数属性を知ろう
PostgreSQLの関数属性を知ろうPostgreSQLの関数属性を知ろう
PostgreSQLの関数属性を知ろう
kasaharatt
 
JPUGしくみ+アプリケーション勉強会(第20回)
JPUGしくみ+アプリケーション勉強会(第20回)JPUGしくみ+アプリケーション勉強会(第20回)
JPUGしくみ+アプリケーション勉強会(第20回)
Yoshinori Nakanishi
 
20090107 Postgre Sqlチューニング(Sql編)
20090107 Postgre Sqlチューニング(Sql編)20090107 Postgre Sqlチューニング(Sql編)
20090107 Postgre Sqlチューニング(Sql編)
Hiromu Shioya
 
MySQLとPostgreSQLの基本的なパラメータ比較
MySQLとPostgreSQLの基本的なパラメータ比較MySQLとPostgreSQLの基本的なパラメータ比較
MySQLとPostgreSQLの基本的なパラメータ比較
Shinya Sugiyama
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編
Miki Shimogai
 
OOW Tokyo 2012 Unconference つまらない STATSPACK をさらにややこしく解説してみよう
OOW Tokyo 2012 Unconference つまらない STATSPACK をさらにややこしく解説してみようOOW Tokyo 2012 Unconference つまらない STATSPACK をさらにややこしく解説してみよう
OOW Tokyo 2012 Unconference つまらない STATSPACK をさらにややこしく解説してみよう
Tadashi Yamashita
 
PostgreSQL17対応版 EXPLAINオプションについて (第49回PostgreSQLアンカンファレンス@東京 発表資料)
PostgreSQL17対応版 EXPLAINオプションについて (第49回PostgreSQLアンカンファレンス@東京 発表資料)PostgreSQL17対応版 EXPLAINオプションについて (第49回PostgreSQLアンカンファレンス@東京 発表資料)
PostgreSQL17対応版 EXPLAINオプションについて (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
 
道具を磨くことのススメ
道具を磨くことのススメ道具を磨くことのススメ
道具を磨くことのススメ
Kenichi Masuda
 
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@KyotoPostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
Shigeru Hanada
 
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
Uptime Technologies LLC (JP)
 
MySQL 5.7 トラブルシューティング 性能解析入門編
MySQL 5.7 トラブルシューティング 性能解析入門編MySQL 5.7 トラブルシューティング 性能解析入門編
MySQL 5.7 トラブルシューティング 性能解析入門編
Mikiya Okuno
 
MySQLステータスモニタリング
MySQLステータスモニタリングMySQLステータスモニタリング
MySQLステータスモニタリング
yoku0825
 
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
Shigeru Hanada
 
PostgreSQL使いのエンジニアから見たMySQL
PostgreSQL使いのエンジニアから見たMySQLPostgreSQL使いのエンジニアから見たMySQL
PostgreSQL使いのエンジニアから見たMySQL
toshihiro_kitagawa
 
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
NTT DATA Technology & Innovation
 
MySQL 5.5 Update #denatech
MySQL 5.5 Update #denatechMySQL 5.5 Update #denatech
MySQL 5.5 Update #denatech
Mikiya Okuno
 
より深く知るオプティマイザとそのチューニング
より深く知るオプティマイザとそのチューニングより深く知るオプティマイザとそのチューニング
より深く知るオプティマイザとそのチューニング
Yuto Hayamizu
 
MySQL 開発最新動向
MySQL 開発最新動向MySQL 開発最新動向
MySQL 開発最新動向
yoyamasaki
 
PostgreSQLの関数属性を知ろう
PostgreSQLの関数属性を知ろうPostgreSQLの関数属性を知ろう
PostgreSQLの関数属性を知ろう
kasaharatt
 
Ad

More from Shinya Sugiyama (20)

MySQLとPostgreSQLの基本的なレプリケーション設定比較
MySQLとPostgreSQLの基本的なレプリケーション設定比較MySQLとPostgreSQLの基本的なレプリケーション設定比較
MySQLとPostgreSQLの基本的なレプリケーション設定比較
Shinya Sugiyama
 
MySQLとPostgreSQLの基本的なバックアップ比較
MySQLとPostgreSQLの基本的なバックアップ比較MySQLとPostgreSQLの基本的なバックアップ比較
MySQLとPostgreSQLの基本的なバックアップ比較
Shinya Sugiyama
 
MySQLとPostgreSQLにおける基本的なアカウント管理
MySQLとPostgreSQLにおける基本的なアカウント管理MySQLとPostgreSQLにおける基本的なアカウント管理
MySQLとPostgreSQLにおける基本的なアカウント管理
Shinya Sugiyama
 
Locondo 20190703@inno db_cluster
Locondo 20190703@inno db_clusterLocondo 20190703@inno db_cluster
Locondo 20190703@inno db_cluster
Shinya Sugiyama
 
Locondo 20190215@ec tech_group
Locondo 20190215@ec tech_groupLocondo 20190215@ec tech_group
Locondo 20190215@ec tech_group
Shinya Sugiyama
 
DB tech showcase_tokyo2018_LOCONDO
DB tech showcase_tokyo2018_LOCONDODB tech showcase_tokyo2018_LOCONDO
DB tech showcase_tokyo2018_LOCONDO
Shinya Sugiyama
 
MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要
Shinya Sugiyama
 
MySQL SYSスキーマのご紹介
MySQL SYSスキーマのご紹介MySQL SYSスキーマのご紹介
MySQL SYSスキーマのご紹介
Shinya Sugiyama
 
MySQL Partition Engine
MySQL Partition EngineMySQL Partition Engine
MySQL Partition Engine
Shinya Sugiyama
 
Oracle Cloud MySQL Service
Oracle Cloud MySQL ServiceOracle Cloud MySQL Service
Oracle Cloud MySQL Service
Shinya Sugiyama
 
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
Shinya Sugiyama
 
MySQL8.0 in COSCUP2017
MySQL8.0 in COSCUP2017MySQL8.0 in COSCUP2017
MySQL8.0 in COSCUP2017
Shinya Sugiyama
 
MySQLデータ暗号化と暗号鍵のローテーション
MySQLデータ暗号化と暗号鍵のローテーションMySQLデータ暗号化と暗号鍵のローテーション
MySQLデータ暗号化と暗号鍵のローテーション
Shinya Sugiyama
 
Power of SQL and NoSQL with MySQL5.7
Power of SQL and NoSQL with MySQL5.7Power of SQL and NoSQL with MySQL5.7
Power of SQL and NoSQL with MySQL5.7
Shinya Sugiyama
 
Multi thread slave_performance_on_opc
Multi thread slave_performance_on_opcMulti thread slave_performance_on_opc
Multi thread slave_performance_on_opc
Shinya Sugiyama
 
db tech showcase2016 - MySQLドキュメントストア
db tech showcase2016 - MySQLドキュメントストアdb tech showcase2016 - MySQLドキュメントストア
db tech showcase2016 - MySQLドキュメントストア
Shinya Sugiyama
 
MySQL57 Update@OSC Fukuoka 20151003
MySQL57 Update@OSC Fukuoka 20151003MySQL57 Update@OSC Fukuoka 20151003
MySQL57 Update@OSC Fukuoka 20151003
Shinya Sugiyama
 
No sql with mysql cluster (MyNA・JPUG合同DB勉強会)
No sql with mysql cluster (MyNA・JPUG合同DB勉強会)No sql with mysql cluster (MyNA・JPUG合同DB勉強会)
No sql with mysql cluster (MyNA・JPUG合同DB勉強会)
Shinya Sugiyama
 
MySQL 5.7とレプリケーションにおける改良
MySQL 5.7とレプリケーションにおける改良MySQL 5.7とレプリケーションにおける改良
MySQL 5.7とレプリケーションにおける改良
Shinya Sugiyama
 
MySQL 5.7 Technical Update (日本語)
MySQL 5.7 Technical Update (日本語)MySQL 5.7 Technical Update (日本語)
MySQL 5.7 Technical Update (日本語)
Shinya Sugiyama
 
MySQLとPostgreSQLの基本的なレプリケーション設定比較
MySQLとPostgreSQLの基本的なレプリケーション設定比較MySQLとPostgreSQLの基本的なレプリケーション設定比較
MySQLとPostgreSQLの基本的なレプリケーション設定比較
Shinya Sugiyama
 
MySQLとPostgreSQLの基本的なバックアップ比較
MySQLとPostgreSQLの基本的なバックアップ比較MySQLとPostgreSQLの基本的なバックアップ比較
MySQLとPostgreSQLの基本的なバックアップ比較
Shinya Sugiyama
 
MySQLとPostgreSQLにおける基本的なアカウント管理
MySQLとPostgreSQLにおける基本的なアカウント管理MySQLとPostgreSQLにおける基本的なアカウント管理
MySQLとPostgreSQLにおける基本的なアカウント管理
Shinya Sugiyama
 
Locondo 20190703@inno db_cluster
Locondo 20190703@inno db_clusterLocondo 20190703@inno db_cluster
Locondo 20190703@inno db_cluster
Shinya Sugiyama
 
Locondo 20190215@ec tech_group
Locondo 20190215@ec tech_groupLocondo 20190215@ec tech_group
Locondo 20190215@ec tech_group
Shinya Sugiyama
 
DB tech showcase_tokyo2018_LOCONDO
DB tech showcase_tokyo2018_LOCONDODB tech showcase_tokyo2018_LOCONDO
DB tech showcase_tokyo2018_LOCONDO
Shinya Sugiyama
 
MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要
Shinya Sugiyama
 
MySQL SYSスキーマのご紹介
MySQL SYSスキーマのご紹介MySQL SYSスキーマのご紹介
MySQL SYSスキーマのご紹介
Shinya Sugiyama
 
Oracle Cloud MySQL Service
Oracle Cloud MySQL ServiceOracle Cloud MySQL Service
Oracle Cloud MySQL Service
Shinya Sugiyama
 
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
Shinya Sugiyama
 
MySQLデータ暗号化と暗号鍵のローテーション
MySQLデータ暗号化と暗号鍵のローテーションMySQLデータ暗号化と暗号鍵のローテーション
MySQLデータ暗号化と暗号鍵のローテーション
Shinya Sugiyama
 
Power of SQL and NoSQL with MySQL5.7
Power of SQL and NoSQL with MySQL5.7Power of SQL and NoSQL with MySQL5.7
Power of SQL and NoSQL with MySQL5.7
Shinya Sugiyama
 
Multi thread slave_performance_on_opc
Multi thread slave_performance_on_opcMulti thread slave_performance_on_opc
Multi thread slave_performance_on_opc
Shinya Sugiyama
 
db tech showcase2016 - MySQLドキュメントストア
db tech showcase2016 - MySQLドキュメントストアdb tech showcase2016 - MySQLドキュメントストア
db tech showcase2016 - MySQLドキュメントストア
Shinya Sugiyama
 
MySQL57 Update@OSC Fukuoka 20151003
MySQL57 Update@OSC Fukuoka 20151003MySQL57 Update@OSC Fukuoka 20151003
MySQL57 Update@OSC Fukuoka 20151003
Shinya Sugiyama
 
No sql with mysql cluster (MyNA・JPUG合同DB勉強会)
No sql with mysql cluster (MyNA・JPUG合同DB勉強会)No sql with mysql cluster (MyNA・JPUG合同DB勉強会)
No sql with mysql cluster (MyNA・JPUG合同DB勉強会)
Shinya Sugiyama
 
MySQL 5.7とレプリケーションにおける改良
MySQL 5.7とレプリケーションにおける改良MySQL 5.7とレプリケーションにおける改良
MySQL 5.7とレプリケーションにおける改良
Shinya Sugiyama
 
MySQL 5.7 Technical Update (日本語)
MySQL 5.7 Technical Update (日本語)MySQL 5.7 Technical Update (日本語)
MySQL 5.7 Technical Update (日本語)
Shinya Sugiyama
 
Ad

MySQLとPostgreSQLの基本的な実行プラン比較

  • 2. Compared Version MySQL PostgreSQL root@localhost [mysql]> select @@version,now(); +-----------+---------------------+ | @@version | now() | +-----------+---------------------+ | 8.0.19 | 2020-05-01 22:57:16 | +-----------+---------------------+ 1 row in set (0.00 sec) postgres=# select version(),now(); PostgreSQL 12.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit | 2020-05-02 08:37:59.159713+09 PostgreSQL 12.2 Release date: 2020-02-13 https://www.postgresql.org/docs/12/release-12-2.html MySQL 8.0.19 Release date: 2020-01-13 https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-19.html
  • 3. STATISTICS FOR MAKING PLAN MySQL PostgreSQL [mysql]> select * from innodb_table_stats where table_name = 'memo'G *************************** 1. row *************************** database_name: confirm table_name: memo last_update: 2020-05-02 02:18:49 n_rows: 10 clustered_index_size: 1 sum_of_other_index_sizes: 0 1 row in set (0.00 sec) [mysql]> select * from innodb_index_stats where table_name = 'memo'G *************************** 1. row *************************** database_name: confirm table_name: memo index_name: PRIMARY last_update: 2020-05-02 02:18:49 stat_name: n_diff_pfx01 stat_value: 10 sample_size: 1 stat_description: id app=# SELECT relpages, reltuples, reltuples/relpages as pagedata app-# FROM pg_class WHERE relname = 'memo'; relpages | reltuples | pagedata ----------+-----------+-------------------- 74 | 10000 | 135.13513513513513 (1 行) app=# SELECT tablename,attname,correlation, inherited, n_distinct, array_to_string(most_common_vals, E'n') as most_common_vals FROM pg_stats WHERE tablename = 'memo'; -[ RECORD 1 ]----+------------- tablename | memo attname | id correlation | 1 inherited | f n_distinct | -1 most_common_vals | -[ RECORD 2 ]----+------------- tablename | memo attname | data correlation | 1 inherited | f n_distinct | 1 most_common_vals | Fragment innodb_stats_persistentの設定、ANALYZE,DDL,その他の処理により更新されます。 InnoDB は、オプティマイザがもっとも効率的なクエリー実行計画を容易に見つけることができる ように、InnoDB テーブルごとの統計を保持しています。 参照:https://dev.mysql.com/doc/refman/8.0/en/innodb-persistent-stats.html https://dev.mysql.com/doc/refman/5.6/ja/innodb-analyze-table-complexity.html VACUUM、ANALYZE、CREATE INDEXなどの一部のDDLコマンドによって更新されます。 問い合わせプランナは、より良い問い合わせ計画を選択するために問い合わせによって取り出され る行数の推定値を必要としています。 参照:https://www.postgresql.jp/document/11/html/planner-stats.html https://github.com/postgres/postgres/blob/master/src/include/catalog/pg_statistic.h 列 値 為 値 行数 程認識 行数 程認識
  • 4. STATISTICS FOR MAKING PLAN MySQL PostgreSQL [root@localhost [mysql]> show global variables like 'innodb_stats_%'; +--------------------------------------+-------------+ | Variable_name | Value | +--------------------------------------+-------------+ | innodb_stats_auto_recalc | ON | | innodb_stats_include_delete_marked | OFF | | innodb_stats_method | nulls_equal | | innodb_stats_on_metadata | OFF | | innodb_stats_persistent | ON | | innodb_stats_persistent_sample_pages | 20 | | innodb_stats_transient_sample_pages | 8 | +--------------------------------------+-------------+ root@localhost [confirm]> analyze table memo; +--------------+---------+----------+----------+ | Table | Op | Msg_type | Msg_text | +--------------+---------+----------+----------+ | confirm.memo | analyze | status | OK | +--------------+---------+----------+----------+ 1 row in set (0.00 sec) -bash-4.2$ cat postgresql.conf | grep -e autovacuum_vacuum_threshold -e autovacuum_analyze_scale_factor #autovacuum_vacuum_threshold = 50 # min number of row updates before #autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze(10%) -bash-4.2$ app=# select name,setting,unit,context,category,short_desc from pg_settings where name like '%statistics%'; -[ RECORD 1 ]--------------------------------------------------- name | default_statistics_target setting | 100 unit | context | user category | 問い合わせのチューニング / その他のプランオプション short_desc | デフォルトの統計情報収集目標を設定。 app=# analyze verbose memo; INFO: "public.memo"を解析しています INFO: "memo": 809ページの内809をスキャン。110000の有効な行と0の不要な行が存在。 30000行をサンプリング。推定総行数は110000 ANALYZE app=# バックグラウンドで行われる自動統計再計算の非同期性の為、innodb_stats_auto_recalcが有効に なっている場合でも、テーブルの10%以上に影響するDML操作の実行後であっても統計がすぐに再計 算されない場合があります。直ぐに統計情報を更新したい場合は、ANALYZEを実行。 その他、ALTER TABLEコマンドでフラグメントと統計を解消する方法として以下のコマンドを実行。 "ALTER TABLE <テーブル名> engine = innodb ,ALGORITHM=INPLACE,LOCK=NONE;" 参照: https://dev.mysql.com/doc/refman/8.0/en/innodb-persistent-stats.html メモ: During the analysis, the table is locked with a read lock for InnoDB and MyISAM. テーブル全体の10%のデータ+50行が更新されたタイミングで統計情報が更新される。 ANALYZEによりpg_statisticに格納される情報量、具体的には、それぞれの列に対する most_common_vals内とhistogram_bounds配列のエントリの最大数は、 ALTER TABLE SET STATISTICSコマンドによって列ごとに、default_statistics_target設定 パラメータを設定することによってグローバルに設定することができます。 参照:https://www.postgresql.jp/document/11/html/planner-stats.html 行 超 大幅 変更 加 場合 統計 自動計算 場合 場合 格納 配列 最大値 設定 付 事 数 設定 事 出来 * 行
  • 5. COST CONTROL FOR MAKING PLAN MySQL PostgreSQL root@localhost [mysql]> select * from mysql.server_cost; +------------------------------+------------+---------------------+---------+---------------+ | cost_name | cost_value | last_update | comment | default_value | +------------------------------+------------+---------------------+---------+---------------+ | disk_temptable_create_cost | NULL | 2018-05-18 00:49:28 | NULL | 20 | | disk_temptable_row_cost | NULL | 2018-05-18 00:49:28 | NULL | 0.5 | | key_compare_cost | NULL | 2018-05-18 00:49:28 | NULL | 0.05 | | memory_temptable_create_cost | NULL | 2018-05-18 00:49:28 | NULL | 1 | | memory_temptable_row_cost | NULL | 2018-05-18 00:49:28 | NULL | 0.1 | | row_evaluate_cost | NULL | 2018-05-18 00:49:28 | NULL | 0.1 | +------------------------------+------------+---------------------+---------+---------------+ root@localhost [mysql]> select * from mysql.engine_cost; +-------------+-------------+------------------------+------------+---------------------+---------+---------------+ | engine_name | device_type | cost_name | cost_value | last_update | comment | default_value | +-------------+-------------+------------------------+------------+---------------------+---------+---------------+ | default | 0 | io_block_read_cost | NULL | 2018-05-18 00:49:28 | NULL | 1 | | default | 0 | memory_block_read_cost | NULL | 2018-05-18 00:49:28 | NULL | 0.25 | +-------------+-------------+------------------------+------------+---------------------+---------+---------------+ root@localhost [confirm]> SHOW GLOBAL VARIABLES like 'optimizer_switch'G *************************** 1. row *************************** Variable_name: optimizer_switch Value: index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condit ion_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_a ccess=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materi alization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisib le_indexes=off,skip_scan=on,hash_join=on [root@postgresql admin]# cat /var/lib/pgsql/12/data/postgresql.conf | grep page_cost #seq_page_cost = 1.0 # measured on an arbitrary scale #random_page_cost = 4.0 # same scale as above [root@postgresql admin]# app=# select name,setting,category from pg_settings where name like '%cost'; name | setting | category -------------------------+---------+----------------------------------------------- cpu_index_tuple_cost | 0.005 | 問い合わせのチューニング / プランナコスト定数 cpu_operator_cost | 0.0025 | 問い合わせのチューニング / プランナコスト定数 cpu_tuple_cost | 0.01 | 問い合わせのチューニング / プランナコスト定数 jit_above_cost | 100000 | 問い合わせのチューニング / プランナコスト定数 jit_inline_above_cost | 500000 | 問い合わせのチューニング / プランナコスト定数 jit_optimize_above_cost | 500000 | 問い合わせのチューニング / プランナコスト定数 parallel_setup_cost | 1000 | 問い合わせのチューニング / プランナコスト定数 parallel_tuple_cost | 0.1 | 問い合わせのチューニング / プランナコスト定数 random_page_cost | 4 | 問い合わせのチューニング / プランナコスト定数 seq_page_cost | 1 | 問い合わせのチューニング / プランナコスト定数 (10 行) server_costやengine_costの値を設定する事により、実行プランを計算する時にの挙動を変更する事が 可能です。ここ数年、Flashディスク等の高速なディスクを利用する事が多も増えているので、実行プラ ンを微調整する為の値です。またOptimizer Switch等もバージョンと共に変化しているので、 そちらも適宜調整すると良いかと思います。 参照: https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0108 シーケンシャルな一連の取り出しの一部となる、ディスクページ取り出しに関する、プランナの 推定コストを設定します。 デフォルトは1.0です。非シーケンシャル的に取り出されるディスク ページのコストに対するプランナの推測を設定します。 デフォルトは4です。 参照: https://www.postgresql.jp/document/11/html/runtime-config-query.html
  • 6. Explain (SQL Execution Plan) root@localhost [mysql]> explain select id from memo where id = 1; +----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+ | 1 | SIMPLE | memo | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | Using index | +----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+ 1 row in set, 1 warning (0.00 sec) postgresql=# explain select id from memo where id = 1; QUERY PLAN ----------------------------------------------------------------------------- Index Only Scan using idx_memo_id on memo (cost=0.28..8.29 rows=1 width=4) Index Cond: (id = 1) MySQL, PostgreSQLのANALYZEによる統計情報は厳密なものではなくランダムなサンプリングを行った結果であり、 実際の処理は実際のデータ分布、インデックス、プラットフォーム等、その他の要因にも依存します。 https://www.postgresql.jp/document/11/html/using-explain.html https://dev.mysql.com/doc/refman/8.0/en/using-explain.html
  • 7. Basic Expain MySQL root@localhost [confirm]> explain select id from memo where id = 1; +----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+ | 1 | SIMPLE | memo | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | Using index | +----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+ 1 row in set, 1 warning (0.00 sec) root@localhost [confirm]> show warnings; +-------+------+--------------------------------------------------------------------+ | Level | Code | Message | +-------+------+--------------------------------------------------------------------+ | Note | 1003 | /* select#1 */ select '1' AS `id` from `confirm`.`memo` where true | +-------+------+--------------------------------------------------------------------+ 1 row in set (0.00 sec) root@localhost [confirm]> explain for connection 38017; +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+ | 1 | SIMPLE | memo | NULL | ALL | NULL | NULL | NULL | NULL | 10 | 100.00 | NULL | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+ 1 row in set (0.00 sec) EXPLAIN (DESC)は、SELECT、DELETE、INSERT、REPLACE、およびUPDATEステートメントで機能します。MySQL 8.0.19以降では、 TABLEステートメントでも機能します。explainで実行プランを確認したのちに、show warningsを実行する事で、実際にMySQLの オプティマイザが書換え最適化したSQLを確認可能です。また、explain for connectionで特定の接続の実行プランを確認する事も可能です。
  • 8. Basic Expain PostgreSQL app=# explain select id from memo where id = 1; QUERY PLAN ----------------------------------------------------------------------------- Index Only Scan using idx_memo_id on memo (cost=0.28..8.29 rows=1 width=4) Index Cond: (id = 1) (2 行) app=# explain analyze select id from memo where id = 1; QUERY PLAN ----------------------------------------------------------------------------------------------------------------------- Index Only Scan using idx_memo_id on memo (cost=0.28..8.29 rows=1 width=4) (actual time=0.011..0.012 rows=1 loops=1) Index Cond: (id = 1) Heap Fetches: 1 Planning Time: 0.046 ms Execution Time: 0.021 ms (5 行) EXPLAINはSELECT,INSERT、UPDATE、DELETE、CREATE TABLE AS、EXECUTで機能します。 (cost=0.28..8.29 rows=1 width=4) - 初期処理の推定コスト。 出力段階が開始できるようになる前に消費される時間。 - 全体推定コスト。 これは計画ノードが実行完了である、つまりすべての利用可能な行を受け取ることを前提として示される。 - 計画ノードが出力する行の推定数。rowsの値は、計画ノードによって処理あるいはスキャンされた行数を表しておらず、ノードによって発行された行数を表す。 - この計画ノードが出力する行の(バイト単位での)推定平均幅。
  • 9. Expain Options MySQL root@localhost [confirm]> explain analyze select * from memo where id = 1G *************************** 1. row *************************** EXPLAIN: -> Rows fetched before execution (actual time=0.000..0.000 rows=1 loops=1) 1 row in set (0.00 sec) root@localhost [confirm]> explain analyze select * from memo where id >= 1 and id < 10 G *************************** 1. row *************************** EXPLAIN: -> Filter: ((memo.id >= 1) and (memo.id < 10)) (cost=2.06 rows=9) (actual time=0.016..0.027 rows=9 loops=1) -> Index range scan on memo using PRIMARY (cost=2.06 rows=9) (actual time=0.014..0.023 rows=9 loops=1) 1 row in set (0.00 sec) root@localhost [confirm]> explain analyze update memo set data = 'analyze テスト' where id = 1G *************************** 1. row *************************** EXPLAIN: <not executable by iterator executor> 1 row in set (0.00 sec) 参考: https://dev.mysql.com/doc/refman/8.0/en/explain.html MySQL 8.0.18はEXPLAIN ANALYZEを導入しています。EXPLAIN ANALYZEは、SELECTステートメントだけでなく、 複数テーブルのUPDATEおよびDELETEステートメントでも使用できます。 MySQL 8.0.19からは、TABLEステートメントでも使用できます。 WL#4168: Implement EXPLAIN ANALYZE
  • 10. Expain Options PostgreSQL app=# explain (analyze on, buffers on, verbose on) select id from memo where id = 1; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------ Index Only Scan using idx_memo_id on public.memo (cost=0.28..8.29 rows=1 width=4) (actual time=0.027..0.029 rows=1 loops=1) Output: id Index Cond: (memo.id = 1) Heap Fetches: 1 Buffers: shared hit=3 Planning Time: 0.084 ms Execution Time: 0.051 ms (7 行) app=# explain verbose select * from memo where id = 1; QUERY PLAN -------------------------------------------------------------------------------- Index Scan using idx_memo_id on public.memo (cost=0.28..8.29 rows=1 width=25) Output: id, data, data2 Index Cond: (memo.id = 1) (3 行) 参考: https://www.postgresql.jp/document/11/html/sql-explain.html 解析でEXPLAINの出力をプログラムに渡すことを考えているのであれば、代わりに機械読み取りが容易な出力書式(XML、JSON、YAML)のいずれかを使用する事も可能です。 指定 取得 確認可能
  • 11. Expain Output Format MySQL 参考: https://dev.mysql.com/doc/refman/8.0/en/explain.html [mysql]> explain format=TRADITIONAL select id from memo where id >= 1 and id < 10G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: memo partitions: NULL type: range possible_keys: PRIMARY key: PRIMARY key_len: 4 ref: NULL rows: 9 filtered: 100.00 Extra: Using where; Using index 1 row in set, 1 warning (0.00 sec) root@localhost [confirm]> [mysql]> explain format=TREE select id from memo where id >= 1 and id < 10G *************************** 1. row *************************** EXPLAIN: -> Filter: ((memo.id >= 1) and (memo.id < 10)) (cost=2.06 rows=9) -> Index range scan on memo using PRIMARY (cost=2.06 rows=9) 1 row in set (0.01 sec) [mysql]> explain format=JSON select id from memo where id = 1G *************************** 1. row *************************** EXPLAIN: { "query_block": { "select_id": 1, "cost_info": { "query_cost": "1.00" }, "table": { "table_name": "memo", <SNIP> "using_index": true, "cost_info": { "read_cost": "0.00", "eval_cost": "0.10", "prefix_cost": "0.00", "data_read_per_join": "16" }, "used_columns": [ "id" ] } } 1 row in set, 1 warning (0.00 sec) 詳細 見積
  • 12. Expain Output Format PostgreSQL 参考: https://www.postgresql.jp/document/11/html/sql-explain.html 解析でEXPLAINの出力をプログラムに渡すことを考えているのであれば、代わりに機械読み取りが容易な出力書式(XML、JSON、YAML)のいずれかを使用する事も可能です。 app=# explain (FORMAT YAML) select id app=# from memo where id = 1; QUERY PLAN ---------------------------------- - Plan: + Node Type: "Index Only Scan"+ Parallel Aware: false + Scan Direction: "Forward" + Index Name: "idx_memo_id" + Relation Name: "memo" + Alias: "memo" + Startup Cost: 0.28 + Total Cost: 8.29 + Plan Rows: 1 + Plan Width: 4 + Index Cond: "(id = 1)" (1 行) app=# explain (FORMAT JSON) select id app=# from memo where id = 1; QUERY PLAN --------------------------------------- [ + { + "Plan": { + "Node Type": "Index Only Scan",+ "Parallel Aware": false, + "Scan Direction": "Forward", + "Index Name": "idx_memo_id", + "Relation Name": "memo", + "Alias": "memo", + "Startup Cost": 0.28, + "Total Cost": 8.29, + "Plan Rows": 1, + "Plan Width": 4, + "Index Cond": "(id = 1)" + } + } + ] (1 行) app=# explain (FORMAT XML) select id app-# from memo where id = 1; QUERY PLAN ---------------------------------------------------------- <explain xmlns="http://www.postgresql.org/2009/explain">+ <Query> + <Plan> + <Node-Type>Index Only Scan</Node-Type> + <Parallel-Aware>false</Parallel-Aware> + <Scan-Direction>Forward</Scan-Direction> + <Index-Name>idx_memo_id</Index-Name> + <Relation-Name>memo</Relation-Name> + <Alias>memo</Alias> + <Startup-Cost>0.28</Startup-Cost> + <Total-Cost>8.29</Total-Cost> + <Plan-Rows>1</Plan-Rows> + <Plan-Width>4</Plan-Width> + <Index-Cond>(id = 1)</Index-Cond> + </Plan> + </Query> + </explain> (1 行)
  • 13. 同義語 実際 構造 関 情報 取得 使用 多 実行 実行 方法 説明 取得 使用 指定 接続 別 属 場合 特権 必要 実行 期待 実際 実行 一致 関 追加 情報 出力 生成 次 情報 提供 推定実行 一部 考慮 推定 含 返 行 推定数 最初 行 返 時間 行 返 時間 実際 秒 複数 場合 図 平均時間 示 返 行数 数 出力形式 指定 指定可能 形式 処理 正確 説明 含 状 出力 提供 他 MySQL
  • 14. 実行 実際 実行時間 他 統計情報 表示 計画 追加情報 出力 具体的 計画 修飾 関数名内 各 対 出力列 含 常 範囲 別名 付 式内 変数 命名 常 統計情報 表示 各 名前 出力 各計画 推定起動 総 推定行数 各行 推定幅 関 情報 含 使用状況 関 情報 含 具体的 共有 数 読 取 数 数 書 出 数 数 数 読 取 数 書 出 数 一時 読 取 数 書 出 数 含 必要 時 内 見 読 取 避 意味 共有 通常 含 一時 含 一時 計画 使用 短期間有効 含 数 変更 問 合 変更 数 示 書 出 数 問 合 処理 間 状態 内 追 出 数 示 上位 表示 数 子 使用 含 形式 非 値 出力 有効 場合 使用 実際 時間 費 時間 追加表示 一部 何度 読 取 問 合 低速 可能性 実際 時間 実際 行数 必要 設定 方 有益 文全体 実行 時間 時間計測 無効 場合 常 計測 有効 場合 使用 要約情報 例 時間 情報 合計 問 合 計画 後 出力 要約情報 使 含 以外 場合 含 使 有効 計画時間 計画 取得 要 時間 必要 再計画 要 時間 含 出力形式 指定 指定可能 以外 出力 出力 同 情報 含 解析 容易 PostgreSQL
  • 15. 機能 拡張 形式 利用可能 拡張情報 使用 視覚的表現 生成 表示 事 可能 色 直感的 実行 状況 確認 事 可能 MySQL 参照
  • 16. 利用 形式 表形式 同様 実行計画 確認 事 可能 表示出来 MySQL 参照
  • 17. Need to Know PostgreSQL (INSERT, UPDATE, DELETE) - 使用 場合 実際 実行 app=# explain analyze delete from memo where id = 1000; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------ Delete on memo (cost=0.28..8.62 rows=2 width=6) (actual time=0.080..0.080 rows=0 loops=1) -> Index Scan using idx_memo_id on memo (cost=0.28..8.62 rows=2 width=6) (actual time=0.020..0.023 rows=2 loops=1) Index Cond: (id = 1000) Planning Time: 0.086 ms Execution Time: 0.111 ms (5 行) app=# select * from memo where id = 1000; id | data | data2 ----+------+------- (0 行) app=# explain (analyze on, buffers on) delete from memo where id = 112; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------ Delete on memo (cost=0.28..8.29 rows=1 width=6) (actual time=0.027..0.027 rows=0 loops=1) Buffers: shared hit=4 dirtied=1 -> Index Scan using idx_memo_id on memo (cost=0.28..8.29 rows=1 width=6) (actual time=0.008..0.008 rows=1 loops=1) Index Cond: (id = 112) Buffers: shared hit=3 Planning Time: 0.077 ms Execution Time: 0.082 ms (7 行) app=# select id from memo where id = 112; id ---- (0 行) 使用 場合 文 実際 実行 忘 返 出力 表示 文 伴 副作用 通常通 発生 文 対 影響 与 実行 場合 以下 方法 使用 参照 ※ 実際 更新
  • 18. Need to Know PostgreSQL (INSERT, UPDATE, DELETE) - 使用 場合 実際 実行 更新 実行
  • 19. MySQL 5.7入門(チューニング基礎編) https://downloads.mysql.com/presentations/20151208_02_MySQL_Tuning_for_Beginners.pdf MySQL 8.0入門セミナー講演資料 (チューニング基礎編、SQLチューニング編) https://www.mysql.com/jp/why-mysql/presentations/mysql-80-for-beginners-tuning-basic-sql-tuning-2020-doc-jp/ MySQL GUIツール Performance Report, Query Analyzer https://downloads.mysql.com/presentations/20150312_03_MySQL_WB_and_MEM.pdf MySQLのEXPLAINを徹底解説 http://nippondanji.blogspot.com/2009/03/mysqlexplain.html PostgreSQL SQL チューニング入門 https://www.postgresql.jp/sites/default/files/2017-01/T6_ExplainingExplain_pgday2012_for_print.pdf まずやっとく PostgreSQLのチューニング https://dbstudychugoku.github.io/pdf/20140713_postgre_tuning.pdf PostgreSQL 12 新機能解説 https://www.sraoss.co.jp/event_seminar/2019/PostgreSQL%2012%20%E6%96%B0%E6%A9%9F%E8%83%BD%E8%A7%A3%E8%AA%AC.pdf 詳細 見 適切 利用 ? 順番 駆動表 適切 選択 最適化 ? 結果 書 換 張 直 複合 列 順番 変更 思 対応方法 関 参考 試 頂 思