SQLの実行計画とは?DBのオプティマイザ とEXPLAINを解説!

せお丸のプログラマー養成講座【サイバーフリークス株式会社】
7 Nov 202011:17

Summary

TLDRこの動画では、SQLの遅さに対処する方法について解説しています。データベースの動作を理解するために、パーサーとオプティマイザーの役割を説明し、実行計画の重要性を強調しています。エクスプレインコマンドを使って実際の実行計画を確認し、インデックスの活用やクエリの最適化ポイントを学ぶことができます。最後に、SQLのパフォーマンスが低下した際の対処法として、インデックスの設定や実行計画の確認、クエリの見直しのステップを紹介しています。

Takeaways

  • 😀 SQLの遅さを感じた際には、データベースの実行計画やオプティマイザーを理解することが重要です。
  • 🔍 パーサーはSQL文の構文チェックを行い、エラーがあれば通知します。
  • 🚀 オプティマイザーはSQLを最適な方法で実行するための計画を立てます。
  • 📚 実行計画は、フルスキャンやインデックスの使用など、データの検索方法を決定します。
  • 🔑 インデックスはデータベースの検索速度に大きな影響を与えます。
  • 🔎 'EXPLAIN'コマンドを使って、データベースの実行計画を確認できます。
  • 📈 実行計画の結果から、インデックスの使用状況や検索の種類を理解できます。
  • 🛠️ インデックスが想定通りに使われていない場合は、クエリの見直しが必要なチューニングポイントです。
  • 📉 パフォーマンス向上のための主な対策は、適切なインデックスの設定と実行計画の確認です。
  • 📚 参考資料として、実行計画の読み方を理解するためのリファレンスが提供されています。
  • 🎓 この動画を通じて、データベースのパフォーマンスチューニングに関するスキルが向上するでしょう。

Q & A

  • SQLが遅いと感じたときに最初に何をすべきですか?

    -最初にインデックスを確認し、適切なインデックスが存在しない場合は追加することを検討すべきです。

  • インデックスを追加してもパフォーマンスが改善されない場合、次に何をチェックすべきですか?

    -次に、EXPLAIN文を使用してオプティマイザの実行計画を確認し、インデックスが意図通りに使われているかをチェックすべきです。

  • EXPLAIN文とは何ですか?

    -EXPLAIN文は、データベースの実行計画を表示するSQL文で、オプティマイザがどのような戦略でクエリを実行するかを知ることができます。

  • 実行計画とは何を表しますか?

    -実行計画は、データベースがクエリを実行する際にオプティマイザが選択した最適な方法を表します。

  • SQLのパーサーとは何ですか?

    -SQLのパーサーは、入力されたSQL文の構文チェックを行い、構文エラーがある場合は報告する部分です。

  • オプティマイザーが実行計画を立てる際に何を考慮しますか?

    -オプティマイザーは、クエリを実行する際の最も効率的な方法を決定する際に、テーブルの構造やインデックスの有無、データの分布などを考慮します。

  • インデックスの利点とは何ですか?

    -インデックスは、データベースの検索速度を向上させることで、特定のデータの検索を高速化する利点を持ちます。

  • EXPLAIN結果の「SELECT_TYPE」とは何を表しますか?

    -「SELECT_TYPE」は、クエリの種類を表しており、単純なSELECT文であれば「SIMPLE」と表示されることが多いです。

  • EXPLAIN結果の「table」欄は何を表しますか?

    -「table」欄は、クエリでアクセスされるテーブルの名前を表します。

  • EXPLAIN結果の「type」欄が「ref」の場合、何を意味しますか?

    -「type」が「ref」の場合、インデックスを使って特定の値を検索していることを意味します。

  • EXPLAIN結果の「possible_keys」と「key」の違いは何ですか?

    -「possible_keys」は利用可能なインデックスの候補を、「key」は実際に使用されたインデックスを表します。

  • EXPLAIN結果の「Extra」欄には何が表示されますか?

    -「Extra」欄には、オプティマイザが実行計画で採用した戦略や、追加の情報を提供するメッセージが表示されます。

Outlines

00:00

😀 SQLの遅さと実行計画の理解

この段落では、データベースの遅いSQLを改善するためのアプローチが説明されています。面接での質問に答えることで、データベースの実行計画やオプティマイザーを理解することが重要だと強調されています。動画の目的は、データベースの動きをわかりやすく解説し、最後に同じ質問に対する答えが得られるようにすることです。SQL文の発行、パーサーによる構文チェック、そしてオプティマイザーによる実行計画の立て方について説明されています。インデックスの活用方法についても触れられており、インデックスの重要性とオプティマイザーの役割が強調されています。

05:02

🔍 実行計画の詳細解説とSQLのチューニング

第二段落では、実行計画の詳細について解説されています。EXPLAIN文を使用して実行計画を取得し、その結果を理解する方法が説明されています。SQLの実行順序、クエリの種類、対象のテーブル、使用されたインデックス、キーの長さ、検索の種類、そしてオプティマイザの戦略などが実行計画から読み取れる情報として挙げられています。この情報を使用して、SQLのパフォーマンスを改善するためのヒントを得る方法が示されています。また、インデックスの使用状況を確認し、パフォーマンスが改善されない場合のアプローチも提案されています。

10:02

🚀 パフォーマンスチューニングのスキルアップと今後の動画

最後の段落では、オプティマイザと実行計画の理解がデータベースのパフォーマンスチューニングにおいて重要なスキルであることが強調されています。過去の動画でインデックスやパーティションに関する解説があり、それらの知識がこの動画で総括されることが期待されています。また、チャンネル登録を促し、次回の動画でデータベースのパフォーマンスチューニングの方法が紹介される旨の告知がされています。視聴者がこの動画を通じて学び、スキルを向上できるようにと期待していることが伝わってきます。

Mindmap

Keywords

💡SQL

SQLは構造化查询语言の略で、データベースに対する問い合わせや操作を行うための言語です。このビデオでは、SQLの遅さとその対策について解説しており、SQLの実行計画やオプティマイザーの理解が重要であると強調しています。

💡実行計画

実行計画は、データベースがSQL文をどのように実行するかの詳細な計画であり、パフォーマンスに大きな影響を与えます。ビデオでは、EXPLAINコマンドを使って実行計画を確認し、最適なインデックスの使用やクエリの最適化を通じてパフォーマンスを改善することが示されています。

💡オプティマイザー

オプティマイザーはデータベース内のSQL文を最適な方法で実行するためのアルゴリズムであり、実行計画を作成する役割を果たします。ビデオでは、オプティマイザーがどうやってSQL文を最適化するかについて説明しており、パフォーマンスチューニングに不可欠な要素とされています。

💡インデックス

インデックスはデータベースのテーブルの検索速度を上げるためのデータ構造であり、ビデオではインデックスの使用がSQLのパフォーマンスにどのように影響するかについて説明されています。また、インデックスが使われていない場合や使い方が不適切な場合の対処方法も触れられています。

💡EXPLAINコマンド

EXPLAINコマンドは、SQLの実行計画を表示するための特別なSQL文であり、ビデオではこのコマンドを使って実際の実行計画を確認し、パフォーマンスの問題点を特定する方法が紹介されています。

💡フルスキャン

フルスキャンは、テーブルの全行を検索することなく、特定の条件に一致する行を見つける方法であり、ビデオではフルスキャンがパフォーマンスにどのような影響を与えるか、またインデックスを用いて高速化する方法について解説されています。

💡セレクトタイプ

セレクトタイプは、EXPLAINコマンドの結果で示されるもので、クエリの種類を表します。ビデオでは、シンプル、プライマリー、サブクエリなど、様々なセレクトタイプが存在し、それぞれが実行計画にどのように影響するかについて説明されています。

💡キーの長さ

キーの長さは、インデックスの効率性に関する指標であり、ビデオではキーの長さが小さいほど検索が高速になる理由と、実行計画からキーの長さをどのように読み取るかが解説されています。

💡const

constは、EXPLAIN結果で特定の値に対する検索を表す用語であり、ビデオではconstが示す検索の性質と、それが実行計画に与える影響について説明されています。

💡テーブル

テーブルはデータベースにおけるデータの集合であり、ビデオではSQL文がどのテーブルを対象に実行されるか、またそのテーブルに対するインデックスの使用や検索方法がどのように実行計画に反映されるかが解説されています。

💡パフォーマンスチューニング

パフォーマンスチューニングは、データベースの処理速度や効率を高めるための最適化作業であり、ビデオではSQL文の遅さに対処するためのチューニング方法が紹介されています。

Highlights

面接でSQLの遅さに関する質問に対処する方法について尋ねられた。

データベースの実行計画やオプティマイザーを理解することの重要性。

データベースの動作プロセスを解説し、SQL文のパーサーの役割を説明。

オプティマイザーがSQLの実行計画を立て、パフォーマンスに影響を与える。

インデックスの活用とその重要性、インデックスの種類について解説。

EXPLAINコマンドを使って実行計画を確認する方法を紹介。

EXPLAIN結果の読み方とリファレンスへのリンクを提供。

実行計画の要素を解説、ID、SELECT_TYPE、TABLE、TYPE、POSSIBLE_KEYS、KEY、KEY_LEN、REF、ROWS、EXTRAの意味を説明。

インデックスの利用状況と実行計画の結果からパフォーマンスチューニングのポイントを導出。

SQLパフォーマンス改善のためのインデックスの設定と実行計画の確認のプロセス。

面接での回答例として、インデックスの設定から実行計画の確認、クエリの見直しのステップを紹介。

インデックスの種類とその使用状況を理解することの重要性。

オプティマイザーの戦略と実行計画の結果から得られる洞察。

データベースのパフォーマンスチューニングの基礎知識を身につけるための過去の動画の紹介。

次回の動画でパフォーマンスチューニングの総集編を公開予定の告知。

チャンネル登録とコメントリクエストでコミュニティとのつながりを促進。

高評価のグッドボタンを押すことで、動画の評価を示すよう促す。

Transcripts

play00:00

性を丸です突然ですが皆さんに質問です

play00:03

sql が遅いなーと思ったときにあなたならどうしますか

play00:07

これ実は私が実際にサイバーエージェントの面接で聞かれた質問なんですがみなさんは

play00:13

パッと答えられますか

play00:15

この質問にちゃんと応えるためにはデータベースの実行計画や

play00:20

オプティマイザーというものをきちんと理解する必要があります

play00:24

方動画ではそんなデータベースで実際にどうやって動いているのというところをわかり

play00:30

やすく解説していきますそしてこの動画の最後でもう一度あなたに同じ質問

play00:36

申します sql が遅いなーと思ったときにあなたならどうしますか

play00:41

今はわからなくても大丈夫です10分後にはちゃんと答えられるようになりますので

play00:45

その答えを探しながらこの動画を最後までご覧ください

play00:49

[音楽]

play00:51

はいそれではまずはデータベースが実際にどうやって動いているのか

play00:55

そのデータベースの処理の流れについて解説していきます

play00:59

まずはみなさんが普段使っているような sql 文を発行します

play01:04

するとデータベースはですねそれを受け取ってパーサーというところがこの sql 文

play01:09

を受けております

play01:11

でこのパーサーではですね sql の構文が正しいのかどうかのチェックを行います

play01:16

例えば何か select 文などを書いた時にこの勢力と部は間違ってますよという

play01:21

ような

play01:21

後部エラーが出ることがありますよねそれはこのパーサーというところですね最初に

play01:26

チェックが行われています

play01:27

次に sql はオプティマイザーと言われるとか

play01:31

のに処理が流れていきますでこのオプティマイザー

play01:34

というのがですね今回の主人公で超重要な部分になります

play01:38

ここではこの受け取った sql をどうやって実行したら一番早く処理を返せるのか

play01:44

というですね

play01:45

実行計画というものを行いますこの実行計画というのはどう

play01:51

そういうことなのかというと例えばこの sql が何かしらの select 文

play01:55

だった時ですねその select 文がテーブル全体をフルスキャンしなければ

play02:01

結果を返せないのかもしくは何かしらのインデックスを使って

play02:06

高速に処理を返せるものなのかというところですね

play02:09

このオプティマイザーというところ

play02:11

で計画を立てるわけです

play02:13

ですのでこのオプティマイザーというところでどういう実行計画になるのかぁという

play02:19

ところが

play02:19

データベースのパフォーマンスに非常に大きく影響する部分になってきます

play02:25

そしてこのオプティマイザーがですねこのエスケール分はインデックスが使えるという

play02:29

判断をした場合はですね

play02:31

インデックスを使って処理が行われてその結果が帰っていくとこういう仕組みになって

play02:36

います

play02:38

なおインデックスのことがまだよく分からないという方はですね

play02:41

以前の動画で解説していますのでそちらの動画をご覧下さい

play02:45

ぴということでデータベースではオプティマイザーというところがですね

play02:49

実行計画というものを立ててこれによってデータベースのパフォーマンスがですね

play02:53

大きく左右されるということが分かりましたそれではこの実行計画

play02:58

ずっとは一体実際にどういうものなのかなというところですね

play03:01

詳しく見ていきましょう

play03:02

[音楽]

play03:05

エクスプレ員というコマンドを使うとデータベースの実行計画を実は簡単に確認する

play03:12

ことができます

play03:14

それではここからはこの x plain というコマンドを使ってですね

play03:17

実際にデータベースがどういう実行計画を立てているかというところですね

play03:22

覗き見していきましょうはいここにとある sql 文がありますこの sql 文

play03:27

自体はなんのこっちゃない f 2の sql 文です

play03:31

セレクト明日た from shops

play03:34

ウェアユーザー id コールにといった感じで何の変哲もない普通の sql 文に

play03:39

なっていますそれではこの sql 文を実行した時にですね

play03:43

データベースがどういう実行計画を立てて検索を行うのか

play03:48

これを実際に見ていきましょうデータベースの実行計画を見るときには sql 文の

play03:54

一番手前の方にですね x プーで em

play03:57

というコマンドをつけたしますたったこれだけでこの sql の実行計画を見ること

play04:03

ができますでは実際にやってみましょう

play04:05

ああ

play04:06

はいするとこのような結果が帰ってきました

play04:09

これがデータベースの実行計画と言われるものです

play04:14

はい実はこちらの結果なんですけどもいったいどういう見方をすればいいのかよく

play04:19

わからないですよね

play04:20

ですのでこの x プレインの結果をどうやって見ればいいのか解説していきます

play04:26

それではこちらのエクスプレインの読み方について解説していきます

play04:31

エクスプレインの結果は正直読みづらいです

play04:34

ですので初めのうちはこういったリファレンスを見ながらですね

play04:39

これはどういう意味なのかなというのを調べながら

play04:42

解読していくことになります

play04:44

今回はわかりやすいリファレンスとしてこちらの記事とあともうひとつこちらの記事

play04:50

ですね

play04:50

2つのリファレンスを用意しました

play04:53

この2つの記事は概要欄に貼っておくので皆さんも参考にしてみてくださいそれでは

play04:59

これらのリファレンスを使いながらですね

play05:01

こちらのエクスプレインの結果を一緒に解読していきましょう

play05:05

まずはこちらの id ですがこれは sql の実行順序を表しています

play05:11

今回は単純に1本だけの sql なので id は一番と書いてあります

play05:17

次にこちらのセレクトタイプですがこれはクエリの種類を表しています

play05:23

今回はシンプルと書いてあります

play05:26

これがどういう意味なのかこちらのリファレンスで確認してみましょうするとこのよう

play05:32

にですね

play05:32

シンプルは単一の艇ブルーと書いてあります今回

play05:37

はショップステイブルーという単一のテーブルに対してのクエリですのでこのように

play05:43

シンプルと表示されています

play05:46

このクエリがですねもう少し複雑なサブクエリなどになってくるとですね

play05:50

他にもプライマリーだったり寒く edit いった値がここに表示されるようになり

play05:54

ます

play05:56

こういった感じで政府とタイプのところにはクエリの種類が表示されるようになってい

play06:00

ます

play06:01

次にテーブルですがショップ数という値が表示されています

play06:06

これは単純に対象のテーブルが表示されています

play06:10

今回はショップステーブルに体質のクエリだったので

play06:13

底部のところにはショップ数と表示されています

play06:16

次にタイプですがここにはレフト書かれています

play06:21

べ風とはどういう意味なのかリファレンスを見てみるとコーストではないインデックス

play06:26

を使って

play06:27

10日検索を行った時に使用されるアクセスと書いてあります

play06:30

何のことやらちょっとわからないですよねコーストっていうのはですね

play06:34

こちらに書いてあるようにプライマリーキーもしくはユニークキーを使用した

play06:39

検索の場合はこの const という値が表示されますそしてこのコースとではない

play06:45

つまりプライマリーキーカーユニークキーではないインデックスを使った検索

play06:49

これがレフに

play06:50

います

play06:51

そして10日検索と書いてありますがこれはウエア

play06:55

型コール v みたいな感じでこの=つまりズバリ値を指定した場合の検索ですねこれ

play07:01

が10日検索です

play07:03

今回の場合はユーザー id =にと書いてありますので10日検索

play07:08

ということになります逆に10日検索ではない

play07:11

パターンというなんですね例えばこんな感じの比較記号を使ってですね

play07:15

兄以上とかこういった場合は10日検索ではないパターンになりますということで今回

play07:21

のこのレフっていうのは何を表しているのかと

play07:23

いうと primarykey でもユニークキーでもないインデックスを使って

play07:27

さらに10日検索が行われているということを表しています

play07:32

次にぽっしゅぶるキーですがこちらは利用可能なインデックス一覧の候補です

play07:38

そしてキーは実際に今回利用されたインデックスです

play07:43

今回はインデックスの候補が一つしかなくて

play07:46

実際にそのインデックスを使用したという形跡がですねこの結果から読み取れます

play07:51

でここでもし自分が想定していたインデックスが使われてない場合はですね

play07:57

クエリを見直すなどチューニングのしどころポイントになってくるわけです

play08:02

次に喜入んですがこちらはキーの長さになります

play08:06

インデックスを使ってですね検索をするときはこの数字が小さければ小さいほど速く

play08:11

なってきます

play08:13

次にレフですがこちらはキーに対してどのような検索を行っているのかを表しています

play08:20

今回はユーザー id =にのように

play08:24

ズバリ決まった値を指定していますこういった場合は

play08:27

const と表示されます次にローズですがこちらはフェッチされるぎー

play08:33

総数の見積もりになります大体これぐらいの行が検索にヒットするだろうなという予想

play08:38

になります

play08:40

最後にエクストラですがこちらはオプティマイザがどのような戦略を立てた彼の補足

play08:45

情報が表示されることがあります

play08:48

今回は塗るとなっているので特に追加の情報は得られなかったのですがここまでの全体

play08:54

の結果を統合してこのインデックスを使って

play08:57

単純なクエリが走ったんだなあということがこの x プレインの結果から読み取る

play09:02

ことができます

play09:03

それではここで改めてあなたに質問します

play09:06

sql が遅いなーと思っ

play09:08

たときにあなたならどうしますか

play09:11

津波に私はサイバーエージェントの面接でこの質問をされたときには次のように答え

play09:16

ました

play09:17

sql のパフォーマンスが悪いときにはまずはインデックスを張ることを考えます

play09:22

ですが

play09:23

インデックスを張ってもパフォーマンスが改善しない場合にはそのインデックスが本当

play09:28

に使われているのかを疑いますですので次にやることは

play09:32

エクスプレインでオプティマイザの実行計画をチェックします

play09:36

インデックスが意図通りに使われているのかをチェックして

play09:39

もし想定外の動きをしているのであればクエリーの見直しなどを行います

play09:44

はいこんな感じで答えた曲があります罪に誤解のないように言っておくと私は別に

play09:50

サイバーエージェントで働いていたというわけではなくてですね

play09:53

ses の連接をする機会があってですねこういう

play09:56

そうされたことがあります

play09:58

今回ですねこういった面接の質問だったりとかあとは私が

play10:02

受け答えした内容だったりっていうところはですねこの動画を観ていただいたことで皆

play10:06

さんも会話の内容は理解できるようになったのではないかと思います

play10:10

オプティマイザとは何なのか実行計画とは何なのか

play10:15

この意味が分かっただけでもですね皆さんはすごく

play10:18

レベルアップできているので自信を持ってくださいこのチャンネルでは過去動画で

play10:22

インデックスについてパーティションについてなど様々な解説を行ってきました

play10:28

そしていよいよ次回の動画ではそれらの総集編としてデータベースのパフォーマンス

play10:33

チューニングのやり方というテーマであなたのスキルをさらにレベルアップできる動画

play10:38

を公開しますので今のうちにチャンネル登録をして次回の動画を期待ください

play10:43

そして今回の動画で何か1つだけでも学ぶことができたという方はですね

play10:48

お願いします動画を閉じる前に高評価のグッドボタンをポチッと押してあげてください

play10:53

さらにコメントもうしていただけたら嬉しいですそれではまた

play10:58

th

play11:04

ええええええ

play11:07

いいえ

play11:08

ええええええ

play11:10

play11:11

ten

play11:14

tee

play11:15

play11:16

ええええええ

Rate This

5.0 / 5 (0 votes)

Ähnliche Tags
データベースSQL遅いSQLインデックス実行計画オプティマイザーパフォーマンスチューニング面接質問技術解説
Benötigen Sie eine Zusammenfassung auf Englisch?