Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

409 views

Published on

MySQLとPostgreSQLの統計情報や実行プランについての確認

Published in: Software
  • Be the first to comment

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

  1. 1. 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
  2. 2. 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 列 値 為 値 行数 程認識 行数 程認識
  3. 3. 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 行 超 大幅 変更 加 場合 統計 自動計算 場合 場合 格納 配列 最大値 設定 付 事 数 設定 事 出来 * 行
  4. 4. 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
  5. 5. 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
  6. 6. 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で特定の接続の実行プランを確認する事も可能です。
  7. 7. 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の値は、計画ノードによって処理あるいはスキャンされた行数を表しておらず、ノードによって発行された行数を表す。 - この計画ノードが出力する行の(バイト単位での)推定平均幅。
  8. 8. 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
  9. 9. 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)のいずれかを使用する事も可能です。 指定 取得 確認可能
  10. 10. 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) 詳細 見積
  11. 11. 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 行)
  12. 12. 同義語 実際 構造 関 情報 取得 使用 多 実行 実行 方法 説明 取得 使用 指定 接続 別 属 場合 特権 必要 実行 期待 実際 実行 一致 関 追加 情報 出力 生成 次 情報 提供 推定実行 一部 考慮 推定 含 返 行 推定数 最初 行 返 時間 行 返 時間 実際 秒 複数 場合 図 平均時間 示 返 行数 数 出力形式 指定 指定可能 形式 処理 正確 説明 含 状 出力 提供 他 MySQL
  13. 13. 実行 実際 実行時間 他 統計情報 表示 計画 追加情報 出力 具体的 計画 修飾 関数名内 各 対 出力列 含 常 範囲 別名 付 式内 変数 命名 常 統計情報 表示 各 名前 出力 各計画 推定起動 総 推定行数 各行 推定幅 関 情報 含 使用状況 関 情報 含 具体的 共有 数 読 取 数 数 書 出 数 数 数 読 取 数 書 出 数 一時 読 取 数 書 出 数 含 必要 時 内 見 読 取 避 意味 共有 通常 含 一時 含 一時 計画 使用 短期間有効 含 数 変更 問 合 変更 数 示 書 出 数 問 合 処理 間 状態 内 追 出 数 示 上位 表示 数 子 使用 含 形式 非 値 出力 有効 場合 使用 実際 時間 費 時間 追加表示 一部 何度 読 取 問 合 低速 可能性 実際 時間 実際 行数 必要 設定 方 有益 文全体 実行 時間 時間計測 無効 場合 常 計測 有効 場合 使用 要約情報 例 時間 情報 合計 問 合 計画 後 出力 要約情報 使 含 以外 場合 含 使 有効 計画時間 計画 取得 要 時間 必要 再計画 要 時間 含 出力形式 指定 指定可能 以外 出力 出力 同 情報 含 解析 容易 PostgreSQL
  14. 14. 機能 拡張 形式 利用可能 拡張情報 使用 視覚的表現 生成 表示 事 可能 色 直感的 実行 状況 確認 事 可能 MySQL 参照
  15. 15. 利用 形式 表形式 同様 実行計画 確認 事 可能 表示出来 MySQL 参照
  16. 16. 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 行) 使用 場合 文 実際 実行 忘 返 出力 表示 文 伴 副作用 通常通 発生 文 対 影響 与 実行 場合 以下 方法 使用 参照 ※ 実際 更新
  17. 17. Need to Know PostgreSQL (INSERT, UPDATE, DELETE) - 使用 場合 実際 実行 更新 実行
  18. 18. 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 詳細 見 適切 利用 ? 順番 駆動表 適切 選択 最適化 ? 結果 書 換 張 直 複合 列 順番 変更 思 対応方法 関 参考 試 頂 思

×