SQL Scale Lab
MySQL 8 · 全 22 章 · 13 章まで無料

3,200 万行を
動かして学ぶ、
超実践的なデータベースの教材。

データベースを基礎から学び、MySQLで3,200 万行のデータベースを操作しながら大規模トラフィックの最適化を身につける。AI時代だからこそ必要な実践的な知識が手に入る。ブラウザだけ、環境構築なし。

SQL を実行しながら学べる

MySQL 8.0(2 vCPU / 4GB / バッファプール 1GB)で実測した記録を、待ち時間ごと再生している。

3,200万行
扱うDBのサイズ
22章
SQL の基礎から最適化まで
13章
無料で読める
¥500
買い切り

この教材が向いている人

技術が移り変わっても必要な、DB の普遍的な基礎知識を身に付けられる。

DB を学び始めた人

学習中
Before

本で仕組みを読んでも、実際の動きがピンとこない

After

基礎から学び、実際に操作することでイメージを掴む

ORM 中心で書いている人

実務
Before

裏で動いている SQL に自信がない

After

実行計画を読み、複合索引を自分で設計できる

大きな DB に触れない人

キャリア
Before

本番規模の障害を見たことがない

After

ロック待ちやデッドロックを、自分の手で起こして直す

わかりやすさの秘訣

その1図解が圧倒的にイメージしやすいから

頭の中ではイメージしにくいデータベース操作も、豊富な図解で目で見て理解できる。

第二部 1 章索引は木
…9.6 万11.2 万12.8 万14.4 万16 万…①根(1 ページ)中間9.6 万〜11.2 万〜12.8 万〜14.4 万〜16 万〜②葉③123456 → 104, 77120, 9930811 …(64 個)
第二部 5 章セカンダリ索引から本体へ、2 段階
セカンダリ索引 idx_customer(customer_id)葉は customer_id + 主キーだけcustomer_idid1234558812123456104123456771201234569930811123457551クラスタインデックス(主キー id の B-tree)葉 = 行そのもの。テーブル本体はこれidorder_idcustomer_idproduct_idquantityunit_price…1042712345644112300…551140123457201500…8812220312345599311200…7712019280123456613800…9930811248270312345681400…WHERE customer_id = 123456 は 2 段階① idx_customer で 123456 を探し、主キー 3 つを得る(強調した 3 行)② その主キーごとにクラスタインデックスを引き、本体行を取る(矢印 3 本)
第二部 4 章複合索引の列順
idx_customer(customer_id)Index lookup 64 行 → Filter → 数行customer_id→ id本体の ordered_at1234558812―12345610430 日より前1234567712030 日以内123456993081130 日以内123457551―読んでから捨てるordered_at は葉に無い。本体行を引いて確かめるidx_customer_ordered(customer_id, ordered_at)Index range scan 数行、Filter なしcustomer_idordered_at→ id123455…881212345630 日より前10412345630 日以内7712012345630 日以内9930811123457…551ここに降りるここまで連続して読むWHERE customer_id = 123456 AND ordered_at >= NOW() - INTERVAL 30 DAY1,000 人分のラボでは: 左は 6.5 万行読んで 4,600 行に絞る(93 % を捨てる)。右は 4,600 前後を読む。
第二部 6 章OFFSET は読んで捨てる
LIMIT 4 OFFSET 20 — 24 行読んで 20 行捨てる読んで捨てる 20 行返す 4 行OFFSET 20,000,000 なら 2,000 万行読んで 10 行返す。ページが深くなるほど線形に遅い。WHERE id > 最後に見た id ORDER BY id LIMIT 4 — 4 行だけ読む触らない 20 行(読まない)読む = 返す 4 行索引で直接この位置へ飛ぶ
第二部 7 章Nested loop の loops
Nested loop: 外側(駆動表)の各行について、内側を引く外側 customers(WHERE で 3 行に絞れた)customer 1001Index lookupcustomer 1002Index lookupcustomer 1003Index lookup内側 order_items(idx_customer で引く)64 行71 行58 行内側ノードの loops = 3actual rows = 平均 64(1 loop あたり)合計出力 = rows × loops内側にインデックスがないと、外側 1 行ごとに内側をフルスキャン3 行 × 3,200 万 = 9,600 万行読む。外側が 1000 行なら 320 億行。これが JOIN 事故の典型。
第二部 9 章デッドロックの輪
トランザクション A商品 A の在庫をロック中トランザクション B商品 B の在庫をロック中商品 B / 商品 AA: 商品 B も欲しい(B 待ち)B: 商品 A も欲しい(A 待ち)互いに相手の解放を待つので永遠に進まない。InnoDB は待ちグラフの循環を検出し、片方(通常は変更量の少ない方)をERROR 1213 で殺す。防ぐ基本は「全トランザクションが同じ順序で行をロックする」。
第二部 5 章バッファプールとディスク
クエリバッファプール(メモリ 1GB)ヒット = プールにあるページを使う(ディスクに行かない)入り切らない分は古いページから追い出すディスク(order_items 本体 2GB + 索引)ミス = Innodb_buffer_pool_readsディスクからページを読んでプールに置く白 = 空き(pages_free)、色付き = 置かれたページ(pages_data)、1 セル = 16KB のページ
第二部 10 章p99 とは何か
平均は嘘をつく。分布の右の尻尾(p95 / p99)がユーザーの体感レイテンシ →p50 = 3msp99 = 180msp99 が悪化する原因: ロック待ち、バッファプールミス、コネクション枯渇、GC。平均を見ていると全部見逃す。
第一部 7 章COMMIT 前は他人に見えない
BEGININSERT 注文UPDATE 在庫 −1COMMITB から見える値: 注文数 50 / 在庫 55(変更前のまま)51 / 54 が一度にUPDATE が失敗ROLLBACK注文は入ったまま → ROLLBACK で注文も消え、50 / 55 に戻るサーバーが落ちたときも、COMMIT 前の変更は同じく残らない。

その2本番環境での挙動を体験できるから

実際に実行ボタンを押してみましょう。

実際に、「インデックス」という機能を使うかどうかによって、データベースの応答がどう変わるか確認してみましょう。「実行する」ボタンを押して見比べてみてください。出力時間の違いを体感できるはず。このように、本教材では、本当のデータベースを触っているような体験をできます。

顧客 123456 の購入明細(インデックスなし)
見る場所: 実行時間と読んだ行数。3,200 万行を端から読む
顧客 123456 の購入明細(インデックスあり)
見る場所: 実行時間と読んだ行数。必要な 64 行だけを読む

MySQL 8.0(2 vCPU / 4GB / バッファプール 1GB)で記録した実測結果を再生します。

なぜここまで変わるのか、第二部 1章で学ぶ
講座内容
第一部 DB 基礎編

小さなショップのデータで、DB の土台を身に付ける

表計算との違いから始めて、SQL、テーブル設計、トランザクション、インデックスまで。200 行の扱いやすいデータを動かしながら、第二部へ進むための基礎を順番に学ぶ。

第二部 パフォーマンス編有料

6 つの障害シナリオで、DB の仕組みを深く理解する

第二部では、本番さながらのアラートを起点に、クエリを叩きながら原因を調査。インデックス、実行計画、ロック、デッドロックなど、DB の性能と障害を読み解く知識を身に付ける。

ブラウザだけで、本番規模を追体験

本番さながらの挙動をブラウザで再現

実際の MySQL で起きたことをブラウザで再生する仕組みにより、結果だけでなく実行にかかった時間や実行計画、統計、セッションの状態まで追体験できます。

MySQL 8.02 vCPUメモリ 4GBバッファプール 1GB最大 3,200 万行
1実測

実環境でクエリを実行

3,200 万行を含むデータへ、教材で扱う SQL を実際に実行。

2記録

DB の挙動を保存

結果、実行時間、推定・実測計画、統計、ロック状態を記録。

3再生

ブラウザで追体験

実行時の待ち時間やセッションの順序とともに、記録を再生。

だから、ブラウザだけでここまで体験できる
4 秒 → 0.2ms

遅さまで体感できる

フルスキャンとインデックス。同じ SQL に生まれる速度差を、数字だけでなく待ち時間として体感できます。

推定 ↔ 実測

実行計画を見比べられる

cost / rows と actual time / rows / loops を並べ、MySQL の予測がどこで外れたのかを読み解けます。

SESSION A ⇄ SESSION B

2 セッションの競合を追える

どちらがロックを持ち、どちらが待たされるのか。ロック待ちやデッドロックを時系列で確認できます。

10 行

小さな表から試せる

第一部で使う顧客一覧(10 行)もブラウザで実行できます。基礎から順番に試せます。

必要なもの

MySQL も Docker も不要。ブラウザを開いた瞬間から、本番規模の DB 挙動を学べます。

※ 教材に用意された SQL の実測記録を再生します。任意の SQL を実環境へ送信する機能ではありません。

半分以上を無料で公開

全 22 章のうち 13 章を、無料で読めます。

DB 基礎編の 11 章はすべて無料。パフォーマンス編も、導入と「4 秒 → 0.2ms」を体験する第二部 1 章まで無料です。

無料で読める範囲
13 / 22 章
全体の半分以上
  • ✓第一部 DB 基礎編:全 11 章
  • ✓第二部 パフォーマンス編:0・1 章
  • ✓登録なし・環境構築なし

よくある質問

環境構築は要りますか+

要りません。ブラウザだけで、SQL の実行結果・実行時間・実行計画を見られます。

SQL を書き換えて実行できますか+

この版は記録の再生です。用意された SQL の実測結果を、記録時の待ち時間ごと再生します。自由記述は実行できません。

無料の範囲は+

第一部の全 11 章と、第二部の 0・1 章。登録なしで読めます。

支払いと返金は+

Stripe のカード決済。デジタルコンテンツのため返金は原則できません。無料の 13 章で確かめてから購入してください。