SlideShare una empresa de Scribd logo
1 de 19
Descargar para leer sin conexión
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
詳細 見 適切 利用 ? 順番 駆動表 適切 選択
最適化 ? 結果 書 換 張 直
複合 列 順番 変更 思 対応方法 関 参考
試 頂 思

Más contenido relacionado

La actualidad más candente

PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...NTT DATA Technology & Innovation
 
Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回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
 
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
 
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 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)NTT DATA Technology & Innovation
 
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)NTT DATA Technology & Innovation
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
Innodb Deep Talk #2 でお話したスライド
Innodb Deep Talk #2 でお話したスライドInnodb Deep Talk #2 でお話したスライド
Innodb Deep Talk #2 でお話したスライドYasufumi Kinoshita
 
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
祝!PostgreSQLレプリケーション10周年!徹底紹介!!祝!PostgreSQLレプリケーション10周年!徹底紹介!!
祝!PostgreSQLレプリケーション10周年!徹底紹介!!NTT DATA Technology & Innovation
 
PostgreSQL Unconference #5 ICU Collation
PostgreSQL Unconference #5 ICU CollationPostgreSQL Unconference #5 ICU Collation
PostgreSQL Unconference #5 ICU CollationNoriyoshi Shinoda
 

La actualidad más candente (20)

PostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラPostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラ
 
PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
 
Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会Inside vacuum - 第一回PostgreSQLプレ勉強会
Inside vacuum - 第一回PostgreSQLプレ勉強会
 
押さえておきたい、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 発表資料)
 
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
 
PostgreSQLコミュニティに飛び込もう
PostgreSQLコミュニティに飛び込もうPostgreSQLコミュニティに飛び込もう
PostgreSQLコミュニティに飛び込もう
 
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
 
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
 
PostgreSQL: XID周回問題に潜む別の問題
PostgreSQL: XID周回問題に潜む別の問題PostgreSQL: XID周回問題に潜む別の問題
PostgreSQL: XID周回問題に潜む別の問題
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Innodb Deep Talk #2 でお話したスライド
Innodb Deep Talk #2 でお話したスライドInnodb Deep Talk #2 でお話したスライド
Innodb Deep Talk #2 でお話したスライド
 
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
祝!PostgreSQLレプリケーション10周年!徹底紹介!!祝!PostgreSQLレプリケーション10周年!徹底紹介!!
祝!PostgreSQLレプリケーション10周年!徹底紹介!!
 
PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"
 
Vacuum徹底解説
Vacuum徹底解説Vacuum徹底解説
Vacuum徹底解説
 
PostgreSQL Unconference #5 ICU Collation
PostgreSQL Unconference #5 ICU CollationPostgreSQL Unconference #5 ICU Collation
PostgreSQL Unconference #5 ICU Collation
 
PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門
 

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

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
 
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-extensionToshi 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 2015Mikiya Okuno
 
More Better Nested Set
More Better Nested SetMore Better Nested Set
More Better Nested Setxibbar
 
20181110 fok2018-pg-extension
20181110 fok2018-pg-extension20181110 fok2018-pg-extension
20181110 fok2018-pg-extensionToshi Harada
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニングKensuke Nagae
 
Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009Akio 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 InterfaceKohei KaiGai
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LTKohei 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 TutorialKen 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 PostgreSQLNoriyoshi Shinoda
 
MySQL 5.7が魅せる新しい運用の形
MySQL 5.7が魅せる新しい運用の形MySQL 5.7が魅せる新しい運用の形
MySQL 5.7が魅せる新しい運用の形yoku0825
 

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

MySQLとPostgreSQLの基本的なパラメータ比較
MySQLとPostgreSQLの基本的なパラメータ比較MySQLとPostgreSQLの基本的なパラメータ比較
MySQLとPostgreSQLの基本的なパラメータ比較
 
MySQLとPostgreSQLにおける基本的なアカウント管理
MySQLとPostgreSQLにおける基本的なアカウント管理MySQLとPostgreSQLにおける基本的なアカウント管理
MySQLとPostgreSQLにおける基本的なアカウント管理
 
MySQLとPostgreSQLの基本的なレプリケーション設定比較
MySQLとPostgreSQLの基本的なレプリケーション設定比較MySQLとPostgreSQLの基本的なレプリケーション設定比較
MySQLとPostgreSQLの基本的なレプリケーション設定比較
 
MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要MySQL8.0 SYS スキーマ概要
MySQL8.0 SYS スキーマ概要
 
5 古雷my sql源碼與資料庫規範
5 古雷my sql源碼與資料庫規範5 古雷my sql源碼與資料庫規範
5 古雷my sql源碼與資料庫規範
 
20190119 aws-study-pg-extension
20190119 aws-study-pg-extension20190119 aws-study-pg-extension
20190119 aws-study-pg-extension
 
MySQLとPostgreSQLの基本的なバックアップ比較
MySQLとPostgreSQLの基本的なバックアップ比較MySQLとPostgreSQLの基本的なバックアップ比較
MySQLとPostgreSQLの基本的なバックアップ比較
 
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
 
More Better Nested Set
More Better Nested SetMore Better Nested Set
More Better Nested Set
 
20181110 fok2018-pg-extension
20181110 fok2018-pg-extension20181110 fok2018-pg-extension
20181110 fok2018-pg-extension
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニング
 
Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009
 
MariaDB Columnstore 使いこなそう
MariaDB Columnstore 使いこなそうMariaDB Columnstore 使いこなそう
MariaDB Columnstore 使いこなそう
 
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
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
Ruby on Rails Tutorial
Ruby on Rails TutorialRuby on Rails Tutorial
Ruby on Rails Tutorial
 
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
 
MySQL 5.7が魅せる新しい運用の形
MySQL 5.7が魅せる新しい運用の形MySQL 5.7が魅せる新しい運用の形
MySQL 5.7が魅せる新しい運用の形
 

Más de Shinya Sugiyama

Locondo 20190703@inno db_cluster
Locondo 20190703@inno db_clusterLocondo 20190703@inno db_cluster
Locondo 20190703@inno db_clusterShinya Sugiyama
 
Locondo 20190215@ec tech_group
Locondo 20190215@ec tech_groupLocondo 20190215@ec tech_group
Locondo 20190215@ec tech_groupShinya Sugiyama
 
DB tech showcase_tokyo2018_LOCONDO
DB tech showcase_tokyo2018_LOCONDODB tech showcase_tokyo2018_LOCONDO
DB tech showcase_tokyo2018_LOCONDOShinya 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 ServiceShinya 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.7Shinya Sugiyama
 
Multi thread slave_performance_on_opc
Multi thread slave_performance_on_opcMulti thread slave_performance_on_opc
Multi thread slave_performance_on_opcShinya 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 20151003Shinya 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 NovaShinya Sugiyama
 
My sql security (暗号化)
My sql security (暗号化) My sql security (暗号化)
My sql security (暗号化) Shinya Sugiyama
 

Más de Shinya Sugiyama (18)

Locondo 20190703@inno db_cluster
Locondo 20190703@inno db_clusterLocondo 20190703@inno db_cluster
Locondo 20190703@inno db_cluster
 
Locondo 20190215@ec tech_group
Locondo 20190215@ec tech_groupLocondo 20190215@ec tech_group
Locondo 20190215@ec tech_group
 
DB tech showcase_tokyo2018_LOCONDO
DB tech showcase_tokyo2018_LOCONDODB tech showcase_tokyo2018_LOCONDO
DB tech showcase_tokyo2018_LOCONDO
 
MySQL SYSスキーマのご紹介
MySQL SYSスキーマのご紹介MySQL SYSスキーマのご紹介
MySQL SYSスキーマのご紹介
 
MySQL Partition Engine
MySQL Partition EngineMySQL Partition Engine
MySQL Partition Engine
 
Oracle Cloud MySQL Service
Oracle Cloud MySQL ServiceOracle Cloud MySQL Service
Oracle Cloud MySQL Service
 
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)
 
MySQL8.0 in COSCUP2017
MySQL8.0 in COSCUP2017MySQL8.0 in COSCUP2017
MySQL8.0 in COSCUP2017
 
MySQLデータ暗号化と暗号鍵のローテーション
MySQLデータ暗号化と暗号鍵のローテーションMySQLデータ暗号化と暗号鍵のローテーション
MySQLデータ暗号化と暗号鍵のローテーション
 
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
 
Multi thread slave_performance_on_opc
Multi thread slave_performance_on_opcMulti thread slave_performance_on_opc
Multi thread slave_performance_on_opc
 
db tech showcase2016 - MySQLドキュメントストア
db tech showcase2016 - MySQLドキュメントストアdb tech showcase2016 - MySQLドキュメントストア
db tech showcase2016 - MySQLドキュメントストア
 
MySQL57 Update@OSC Fukuoka 20151003
MySQL57 Update@OSC Fukuoka 20151003MySQL57 Update@OSC Fukuoka 20151003
MySQL57 Update@OSC Fukuoka 20151003
 
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勉強会)
 
MySQL 5.7とレプリケーションにおける改良
MySQL 5.7とレプリケーションにおける改良MySQL 5.7とレプリケーションにおける改良
MySQL 5.7とレプリケーションにおける改良
 
MySQL 5.7 Technical Update (日本語)
MySQL 5.7 Technical Update (日本語)MySQL 5.7 Technical Update (日本語)
MySQL 5.7 Technical Update (日本語)
 
MySQL Fabric with OpenStack Nova
MySQL Fabric with OpenStack NovaMySQL Fabric with OpenStack Nova
MySQL Fabric with OpenStack Nova
 
My sql security (暗号化)
My sql security (暗号化) My sql security (暗号化)
My sql security (暗号化)
 

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

  • 1.
  • 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 詳細 見 適切 利用 ? 順番 駆動表 適切 選択 最適化 ? 結果 書 換 張 直 複合 列 順番 変更 思 対応方法 関 参考 試 頂 思