inflearn logo
知識共有
inflearn logo

現役DBAチームリーダーが教えるMySQL実行計画・インデックス実践 — バックエンド開発者のためのスロークエリ診療所

遅いクエリを1行受け取ったとき、何を見て、何を修正し、どう証明すればよいでしょうか?注文100万件の仮想ショッピングモールを自分のPC上のMySQL 8.0で動かし、EXPLAIN・EXPLAIN ANALYZE・インデックス設計を実際に実行しながら学ぶ、全55講の実践講座です。

1名 が受講中です。

難易度 初級

受講期間 無制限

SQL
SQL
MySQL
MySQL
Docker
Docker
DBMS/RDBMS
DBMS/RDBMS
SQLD
SQLD
SQL
SQL
MySQL
MySQL
Docker
Docker
DBMS/RDBMS
DBMS/RDBMS
SQLD
SQLD

受講後に得られること

  • EXPLAINのtype・key・rows・filtered・Extraと、EXPLAIN ANALYZEのactual time・rows・loopsを自分で読み取ります。

  • スロークエリログとperformance_schemaのダイジェストから、まず修正するクエリを選びます。

  • 複合インデックスの順序・カバリング・ソート・グルーピングを、実施前後の実測値に基づいて決定します。

  • 結合順序・hash join・サブクエリ変換(semijoin、派生テーブル、相関サブクエリ)を実行計画で説明します。

  • 修正したクエリの結果の同一性と書き込みコストを確認し、インビジブルインデックスを使って安全に元に戻す方法を学びます。


この講義は

遅いクエリを一行受け取ったとき、何を見て、何を直し、どう証明するのでしょうか? 注文100万件の仮想ショッピングモールを手元のPCでMySQL 8.0上に立ち上げ、EXPLAIN・EXPLAIN ANALYZE・インデックス設計を実際に試しながら学ぶ、全55講の実践講座です。

概念の整理よりも「症状(スローログの1行)→診断→修正→実証」の順で、現役のDBプラットフォームチームが運用現場で受けるような事例を仮想データで再構成しました。インデックスを追加したらかえって遅くなった実際の結果も、そのまま扱います。





本講座では、以下の内容を学びます

  • EXPLAINのtype・key・rows・filtered・Extraと、EXPLAIN ANALYZEのactual time・rows・loopsを自分で読み解きます。

  • スローログとperformance_schemaのダイジェストから、まず改善すべきクエリを選びます。

  • 複合インデックスのカラム順・カバリング・ソート・グルーピングを、変更前後の実測値に基づいて決定します。

  • 結合順序・hash join・サブクエリ変換(semijoin、派生テーブル、相関サブクエリ)を実行計画を使って説明します。

  • 修正したクエリの結果の同一性・書き込みコストを確認し、不可視インデックスを使って安全に元に戻す方法を学びます。

こんな方におすすめです

  • クエリは書くものの、実行計画を読んだことがないバックエンド開発者

  • 遅いクエリへの対応を初めて任されたジュニア開発者

  • SQLDの取得を目指している方、または取得後に実務でのチューニングを始めようとしている方

前提知識

  • SELECT・WHERE・JOIN・GROUP BYを読み書きできること、

  • Docker Desktopのインストールとターミナルの基本コマンド

扱わないもの

  • ロック・デッドロック・分離レベル(別途講義テーマ)

  • サーバーパラメータのチューニング・パーティショニング・シャーディング

  • Aurora・クラウド運用


カリキュラム(3時間57分)

セクション1. スロークエリの1行から始める

  • 第01講 講義マップと実習環境(4:53)・プレビュー

  • 第2講 仮想ショッピングモールのデータを見てみる (4:19)

  • 第3講 スローログを有効にして最初の記録を読む (4:14)

  • 第04講 昨日から注文一覧の表示が遅いです(4:38)・プレビュー

  • 05講 診断の4段階 (3:55)

セクション 2. EXPLAIN の読み方

  • 第06講 EXPLAINヒートマップ (4:01)

  • 07講 typeの段階(4:07)

  • 08講 rowsとfiltered(4:27)

  • 第09講 Extraの読み方 (4:29)

  • 第10講 FORMAT=TREEで読む順序 (4:21)

セクション 3. EXPLAIN ANALYZEで実測する

  • 第11講 EXPLAIN ANALYZE:予想と実測 (4:46)

  • 第12回 actual timeとloopsを掛ける (4:14)

  • 13講 統計がずれるとき:ヒストグラム (3:57)

  • 第14講 Handlerカウンターで読み取った行数を数える (3:41)

  • 第15講 予想984行、実際51,021行(4:05)

セクション4. インデックスの仕組み

  • 第16講 クラスタ化主キー (3:46)

  • 第17講 セカンダリインデックスと読み戻しコスト(3:54)

  • 第18講 インデックスが使われない条件(4:01)

  • 19講 選択性:同じインデックス、異なる選択 (3:47)

  • 第20講 DATE()ひとつでフルスキャン (4:11) · プレビュー

セクション5. 複合インデックスの順序

  • 21講 等号が先、範囲が後 (3:54)

  • 第22講 key_lenで使用されたカラムを読み取る (4:01)

  • 23講 先頭列がない場合:skip scan (4:24)

  • 第24講 4種類の順序実験 (4:23)

  • 第25講 事例:インデックスを追加したのに遅くなった(5:05)

セクション6. カバリングインデックスとソート

  • 第26講 Using indexの意味 (4:19)

  • 第27講 カバリングで「取り出し」をなくす(4:22)

  • 第28講 ORDER BYとfilesort(4:12)

  • 第29講 ソート方向が混在する場合(4:04)

  • 第30講 事例:OFFSET地獄とキーセットページネーション (4:53)

セクション7. GROUP BY・集計・LIMIT

  • 第31講 Using temporaryが発生する理由 (4:05)

  • 第32講 インデックスでグルーピングする (3:46)

  • 第33講 COUNT(*)のコスト (4:20)

  • 第34講 LIMITが早く終わるとき(4:05)

  • 第35講 ダッシュボードの集計が遅いです(4:49)

セクション8. 結合の実行計画

  • 第36講 ドライビングテーブルとNested Loop(4:37)

  • 37講 結合カラムのインデックスの有無 (4:23)

  • 第38講 Hash Joinが登場する条件 (4:58)

  • 39講 結合順序とSTRAIGHT_JOIN (4:40)

  • 40講 事例:3重JOIN 1.26秒 (4:55)

セクション9. サブクエリ・IN・EXISTS

  • 第41講 INサブクエリとsemijoin (4:42)

  • 第42講 IN・EXISTS・JOINの比較(4:26)

  • 第43講 派生テーブル:mergeと具体化 (4:31)

  • 第44講 相関サブクエリとloops (4:35)

  • 45講 会員別の最新注文1件 (4:53)

セクション10. スロークエリを選び、実証する

  • 46講 上位クエリの選択 (4:22)

  • 47講 総時間 vs 1回あたりの時間 (4:10)

  • 第48講 結果の同一性を検証する(4:06)

  • 第49講 インデックス追加のコスト (3:55)

  • 50講 インビジブルインデックスとヒント(4:16)

セクション11.総合実習

  • 51講 初めて見るスローログの診断 (4:01)

  • 52講 ケースA:会員検索画面(4:02)

  • 第53講 事例B:精算バッチ(4:27)

  • 第54講 ケースC:管理者向け注文一覧(4:18)

  • 第55回 レビューチェックリストと今後の学習(3:57)


講師紹介

20年以上にわたりデータベースとIT分野で経験を積んできたチュ・ギョンホです。DBAおよびDB Platformチームマネージャーとしてデータベースプラットフォームに携わり、MySQL・PostgreSQL・Oracle・MongoDBとSQLチューニング、AWS・Terraform・Pythonを専門分野としています。

DBプラットフォームチームで毎日スロークエリを診断し、開発チームにチューニングの方向性を案内してきました。今回の講義では、その診断手順を開発者が一人でも実践できるよう、教育用の仮想ショッピングモールのデータと実際の実行結果だけを使って再構成しました。会社の運用データは使用していません。

よくある質問

Q. MySQLを初めて使うのですが、受講できますか?
A. SELECT・JOIN・GROUP BYが読めれば大丈夫です。実行計画は最初から説明します。

Q. 演習環境はどのように準備すればよいですか?
A. Docker Desktopをインストールし、演習用ZIPのlabフォルダでdocker compose up -dを実行すると、MySQL 8.0と仮想ショッピングモールのデータが1~3分で作成されます。

Q. 講義画面の数値と自分の結果が異なります。
A. 時間(ms・秒)はコンピューターによって異なります。行数(rows、Rows_examined、Handler_read_*)と実行計画の形、前後の大小関係を比較してください。オプティマイザーの統計による推定値も多少異なる場合があります。

Q. Aurora MySQL・RDSでもそのまま使えますか?
A. 実行計画の読み方とインデックス設計の原則は同じです。講義の実習はローカルのMySQL 8.0.46で測定しました。

Q. Windowsでも使えますか?
A. Docker Desktopが動作すれば、同じコマンドで実行できます。制作時はmacOSで検証しており、Windowsでは直接検証していません。

Q. ロック・デッドロックも扱いますか?
A. この講義では実行計画・インデックス・スロークエリに重点を置いています。ロック・デッドロックは別講義のテーマです。

Q. ナレーションは人の声ですか?
A. AI合成音声です。画面のSQL・実行結果・実行計画は、実習用DBで実際に実行した出力です。

動画のナレーションはAI合成音声です。画面上のSQLの結果・実行計画は、実習用DBで実際に実行した出力です。

こんな方に
おすすめです

学習対象は
誰でしょう?

  • クエリは書くけれど、実行計画を読んだことがないバックエンド開発者

  • 遅いクエリへの対応を初めて任されたジュニア開発者

  • SQLDの取得を目指している方、または取得後に実務でのチューニングを始めようとしている方

前提知識、
必要でしょうか?

  • SELECT・WHERE・JOIN・GROUP BYを読み書きできる

  • Docker Desktopのインストールとターミナルの基本コマンド

こんにちは
dorian05202988です。

キャリア認証

20年以上にわたりデータベースとIT分野でキャリアを積んできたデータ職人です。DBAおよびDB Platformチームのマネージャーとしてデータベースプラットフォームに携わり、MySQL・PostgreSQL・Oracle・MongoDB、SQLチューニング、AWS・Terraform・Pythonを専門分野としています。ゲーム・金融・ITサービス分野での経験をもとに、データベースとクラウドアーキテクチャについて解説しています。『オラ​​クル実務チューニング SQLパターン学習』と『Oracle Pro*C実務プロジェクト活用書』を出版し、AWS Summit 2018・2019と「データよ、遊ぼう」2020では、サーバーレス・データベースの選択・マルチデータベース戦略について発表しました。最近は、Bedrock LLMを利用したスロークエリの分析・チューニング提案、DBスペック算定の自動化、DBメタMCPサーバーとSlackボットを通じた照会フローを扱っています。開発者向けのデータベース自動化と、非開発者向けのAI業務活用について、各コースの対象者と目的に合わせた実習を通じて解説しています。AIの提案をそのまま適用するのではなく、結果の同一性・実行計画・観測条件を確認し、根拠が不足している場合は保留する判断基準を伝えています。会社の運用データや認証情報は講義資料に含めません。

もっと見る

カリキュラム

全体

55件 ∙ (3時間 56分)

講座資料:

授業資料
講座掲載日: 
最終更新日: 

受講レビュー

まだ十分な評価が集まっていない講座です。
ぜひ最初のレビューをお寄せください。

dorian05202988の他の講座

知識共有者の他の講座はこちら

似ている講座

同じ分野の他の講座を見てみましょう!

期間限定セール

¥79,200

20%

¥12,520