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)

GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
lestrrat
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
Akihiro Kuwano
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
増田 亨
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
 
Flutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成する
Flutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成するFlutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成する
Flutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成する
IgaHironobu
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
Masakazu Matsushita
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
Tetsutaro Watanabe
 
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
 
Node js 入門
Node js 入門Node js 入門
Node js 入門
Satoshi Takami
 
5分で解るセキュアコーディング
5分で解るセキュアコーディング5分で解るセキュアコーディング
5分で解るセキュアコーディング
Yasuo Ohgaki
 
손코딩뇌컴파일눈디버깅을 소개합니다.
손코딩뇌컴파일눈디버깅을 소개합니다.손코딩뇌컴파일눈디버깅을 소개합니다.
손코딩뇌컴파일눈디버깅을 소개합니다.
Kwangsung Ha
 
外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話
ichirin2501
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
Docker Tokyo
Docker TokyoDocker Tokyo
Docker Tokyo
cyberblack28 Ichikawa
 
動的なILの生成と編集
動的なILの生成と編集動的なILの生成と編集
動的なILの生成と編集
terurou
 
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
Recruit Technologies
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
Mikiya Okuno
 
.NET 7におけるBlazorの新機能
.NET 7におけるBlazorの新機能.NET 7におけるBlazorの新機能
.NET 7におけるBlazorの新機能
TomomitsuKusaba
 
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
lestrrat
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
Akihiro Kuwano
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
増田 亨
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
 
Flutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成する
Flutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成するFlutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成する
Flutterでscroll viewとexpandedを併用してsign in sign up画面 などの レイアウトを作成する
IgaHironobu
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
Masakazu Matsushita
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
Tetsutaro Watanabe
 
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
 
5分で解るセキュアコーディング
5分で解るセキュアコーディング5分で解るセキュアコーディング
5分で解るセキュアコーディング
Yasuo Ohgaki
 
손코딩뇌컴파일눈디버깅을 소개합니다.
손코딩뇌컴파일눈디버깅을 소개합니다.손코딩뇌컴파일눈디버깅을 소개합니다.
손코딩뇌컴파일눈디버깅을 소개합니다.
Kwangsung Ha
 
外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話
ichirin2501
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
動的なILの生成と編集
動的なILの生成と編集動的なILの生成と編集
動的なILの生成と編集
terurou
 
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
Recruit Technologies
 
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
なぜ、いま リレーショナルモデルなのか(理論から学ぶデータベース実践入門読書会スペシャル)
Mikiya Okuno
 
.NET 7におけるBlazorの新機能
.NET 7におけるBlazorの新機能.NET 7におけるBlazorの新機能
.NET 7におけるBlazorの新機能
TomomitsuKusaba
 

Similar to MySQLとPostgreSQLの基本的な実行プラン比較 (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
 
MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要
Shinya Sugiyama
 
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
 
5 古雷my sql源碼與資料庫規範
5 古雷my sql源碼與資料庫規範5 古雷my sql源碼與資料庫規範
5 古雷my sql源碼與資料庫規範
Ivan Tu
 
20190119 aws-study-pg-extension
20190119 aws-study-pg-extension20190119 aws-study-pg-extension
20190119 aws-study-pg-extension
Toshi Harada
 
MySQLとPostgreSQLの基本的なバックアップ比較
MySQLとPostgreSQLの基本的なバックアップ比較MySQLとPostgreSQLの基本的なバックアップ比較
MySQLとPostgreSQLの基本的なバックアップ比較
Shinya Sugiyama
 
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
Mikiya Okuno
 
More Better Nested Set
More Better Nested SetMore Better Nested Set
More Better Nested Set
xibbar
 
20181110 fok2018-pg-extension
20181110 fok2018-pg-extension20181110 fok2018-pg-extension
20181110 fok2018-pg-extension
Toshi Harada
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニング
Kensuke Nagae
 
Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009
Akio Ishida
 
MariaDB Columnstore 使いこなそう
MariaDB Columnstore 使いこなそうMariaDB Columnstore 使いこなそう
MariaDB Columnstore 使いこなそう
KAWANO KAZUYUKI
 
Inside Movable Type
Inside Movable TypeInside Movable Type
Inside Movable Type
純生 野田
 
PostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfacePostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join Interface
Kohei KaiGai
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT
Kohei KaiGai
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
 
Ruby on Rails Tutorial
Ruby on Rails TutorialRuby on Rails Tutorial
Ruby on Rails Tutorial
Ken Iiboshi
 
PostgreSQL Unconference #26 No Error on PostgreSQL
PostgreSQL Unconference #26 No Error on PostgreSQLPostgreSQL Unconference #26 No Error on PostgreSQL
PostgreSQL Unconference #26 No Error on PostgreSQL
Noriyoshi Shinoda
 
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
 
MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要
Shinya Sugiyama
 
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
 
5 古雷my sql源碼與資料庫規範
5 古雷my sql源碼與資料庫規範5 古雷my sql源碼與資料庫規範
5 古雷my sql源碼與資料庫規範
Ivan Tu
 
20190119 aws-study-pg-extension
20190119 aws-study-pg-extension20190119 aws-study-pg-extension
20190119 aws-study-pg-extension
Toshi Harada
 
MySQLとPostgreSQLの基本的なバックアップ比較
MySQLとPostgreSQLの基本的なバックアップ比較MySQLとPostgreSQLの基本的なバックアップ比較
MySQLとPostgreSQLの基本的なバックアップ比較
Shinya Sugiyama
 
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
Mikiya Okuno
 
More Better Nested Set
More Better Nested SetMore Better Nested Set
More Better Nested Set
xibbar
 
20181110 fok2018-pg-extension
20181110 fok2018-pg-extension20181110 fok2018-pg-extension
20181110 fok2018-pg-extension
Toshi Harada
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニング
Kensuke Nagae
 
Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009
Akio Ishida
 
MariaDB Columnstore 使いこなそう
MariaDB Columnstore 使いこなそうMariaDB Columnstore 使いこなそう
MariaDB Columnstore 使いこなそう
KAWANO KAZUYUKI
 
PostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join InterfacePostgreSQL v9.5の新機能~CustomScan/Join Interface
PostgreSQL v9.5の新機能~CustomScan/Join Interface
Kohei KaiGai
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT
Kohei KaiGai
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
 
Ruby on Rails Tutorial
Ruby on Rails TutorialRuby on Rails Tutorial
Ruby on Rails Tutorial
Ken Iiboshi
 
PostgreSQL Unconference #26 No Error on PostgreSQL
PostgreSQL Unconference #26 No Error on PostgreSQLPostgreSQL Unconference #26 No Error on PostgreSQL
PostgreSQL Unconference #26 No Error on PostgreSQL
Noriyoshi Shinoda
 
Ad

More from Shinya Sugiyama (18)

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
 
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 Fabric with OpenStack Nova
MySQL Fabric with OpenStack NovaMySQL Fabric with OpenStack Nova
MySQL Fabric with OpenStack Nova
Shinya Sugiyama
 
My sql security (暗号化)
My sql security (暗号化) My sql security (暗号化)
My sql security (暗号化)
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
 
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
 
MySQL Fabric with OpenStack Nova
MySQL Fabric with OpenStack NovaMySQL Fabric with OpenStack Nova
MySQL Fabric with OpenStack Nova
Shinya Sugiyama
 
My sql security (暗号化)
My sql security (暗号化) My sql security (暗号化)
My sql security (暗号化)
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 詳細 見 適切 利用 ? 順番 駆動表 適切 選択 最適化 ? 結果 書 換 張 直 複合 列 順番 変更 思 対応方法 関 参考 試 頂 思