SQLの実行計画とは?DBのオプティマイザ とEXPLAINを解説!
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
😀 SQLの遅さと実行計画の理解
この段落では、データベースの遅いSQLを改善するためのアプローチが説明されています。面接での質問に答えることで、データベースの実行計画やオプティマイザーを理解することが重要だと強調されています。動画の目的は、データベースの動きをわかりやすく解説し、最後に同じ質問に対する答えが得られるようにすることです。SQL文の発行、パーサーによる構文チェック、そしてオプティマイザーによる実行計画の立て方について説明されています。インデックスの活用方法についても触れられており、インデックスの重要性とオプティマイザーの役割が強調されています。
🔍 実行計画の詳細解説とSQLのチューニング
第二段落では、実行計画の詳細について解説されています。EXPLAIN文を使用して実行計画を取得し、その結果を理解する方法が説明されています。SQLの実行順序、クエリの種類、対象のテーブル、使用されたインデックス、キーの長さ、検索の種類、そしてオプティマイザの戦略などが実行計画から読み取れる情報として挙げられています。この情報を使用して、SQLのパフォーマンスを改善するためのヒントを得る方法が示されています。また、インデックスの使用状況を確認し、パフォーマンスが改善されない場合のアプローチも提案されています。
🚀 パフォーマンスチューニングのスキルアップと今後の動画
最後の段落では、オプティマイザと実行計画の理解がデータベースのパフォーマンスチューニングにおいて重要なスキルであることが強調されています。過去の動画でインデックスやパーティションに関する解説があり、それらの知識がこの動画で総括されることが期待されています。また、チャンネル登録を促し、次回の動画でデータベースのパフォーマンスチューニングの方法が紹介される旨の告知がされています。視聴者がこの動画を通じて学び、スキルを向上できるようにと期待していることが伝わってきます。
Mindmap
Keywords
💡SQL
💡実行計画
💡オプティマイザー
💡インデックス
💡EXPLAINコマンド
💡フルスキャン
💡セレクトタイプ
💡キーの長さ
💡const
💡テーブル
💡パフォーマンスチューニング
Highlights
面接でSQLの遅さに関する質問に対処する方法について尋ねられた。
データベースの実行計画やオプティマイザーを理解することの重要性。
データベースの動作プロセスを解説し、SQL文のパーサーの役割を説明。
オプティマイザーがSQLの実行計画を立て、パフォーマンスに影響を与える。
インデックスの活用とその重要性、インデックスの種類について解説。
EXPLAINコマンドを使って実行計画を確認する方法を紹介。
EXPLAIN結果の読み方とリファレンスへのリンクを提供。
実行計画の要素を解説、ID、SELECT_TYPE、TABLE、TYPE、POSSIBLE_KEYS、KEY、KEY_LEN、REF、ROWS、EXTRAの意味を説明。
インデックスの利用状況と実行計画の結果からパフォーマンスチューニングのポイントを導出。
SQLパフォーマンス改善のためのインデックスの設定と実行計画の確認のプロセス。
面接での回答例として、インデックスの設定から実行計画の確認、クエリの見直しのステップを紹介。
インデックスの種類とその使用状況を理解することの重要性。
オプティマイザーの戦略と実行計画の結果から得られる洞察。
データベースのパフォーマンスチューニングの基礎知識を身につけるための過去の動画の紹介。
次回の動画でパフォーマンスチューニングの総集編を公開予定の告知。
チャンネル登録とコメントリクエストでコミュニティとのつながりを促進。
高評価のグッドボタンを押すことで、動画の評価を示すよう促す。
Transcripts
性を丸です突然ですが皆さんに質問です
sql が遅いなーと思ったときにあなたならどうしますか
これ実は私が実際にサイバーエージェントの面接で聞かれた質問なんですがみなさんは
パッと答えられますか
この質問にちゃんと応えるためにはデータベースの実行計画や
オプティマイザーというものをきちんと理解する必要があります
方動画ではそんなデータベースで実際にどうやって動いているのというところをわかり
やすく解説していきますそしてこの動画の最後でもう一度あなたに同じ質問
申します sql が遅いなーと思ったときにあなたならどうしますか
今はわからなくても大丈夫です10分後にはちゃんと答えられるようになりますので
その答えを探しながらこの動画を最後までご覧ください
[音楽]
はいそれではまずはデータベースが実際にどうやって動いているのか
そのデータベースの処理の流れについて解説していきます
まずはみなさんが普段使っているような sql 文を発行します
するとデータベースはですねそれを受け取ってパーサーというところがこの sql 文
を受けております
でこのパーサーではですね sql の構文が正しいのかどうかのチェックを行います
例えば何か select 文などを書いた時にこの勢力と部は間違ってますよという
ような
後部エラーが出ることがありますよねそれはこのパーサーというところですね最初に
チェックが行われています
次に sql はオプティマイザーと言われるとか
のに処理が流れていきますでこのオプティマイザー
というのがですね今回の主人公で超重要な部分になります
ここではこの受け取った sql をどうやって実行したら一番早く処理を返せるのか
というですね
実行計画というものを行いますこの実行計画というのはどう
そういうことなのかというと例えばこの sql が何かしらの select 文
だった時ですねその select 文がテーブル全体をフルスキャンしなければ
結果を返せないのかもしくは何かしらのインデックスを使って
高速に処理を返せるものなのかというところですね
このオプティマイザーというところ
で計画を立てるわけです
ですのでこのオプティマイザーというところでどういう実行計画になるのかぁという
ところが
データベースのパフォーマンスに非常に大きく影響する部分になってきます
そしてこのオプティマイザーがですねこのエスケール分はインデックスが使えるという
判断をした場合はですね
インデックスを使って処理が行われてその結果が帰っていくとこういう仕組みになって
います
なおインデックスのことがまだよく分からないという方はですね
以前の動画で解説していますのでそちらの動画をご覧下さい
ぴということでデータベースではオプティマイザーというところがですね
実行計画というものを立ててこれによってデータベースのパフォーマンスがですね
大きく左右されるということが分かりましたそれではこの実行計画
ずっとは一体実際にどういうものなのかなというところですね
詳しく見ていきましょう
[音楽]
エクスプレ員というコマンドを使うとデータベースの実行計画を実は簡単に確認する
ことができます
それではここからはこの x plain というコマンドを使ってですね
実際にデータベースがどういう実行計画を立てているかというところですね
覗き見していきましょうはいここにとある sql 文がありますこの sql 文
自体はなんのこっちゃない f 2の sql 文です
セレクト明日た from shops
ウェアユーザー id コールにといった感じで何の変哲もない普通の sql 文に
なっていますそれではこの sql 文を実行した時にですね
データベースがどういう実行計画を立てて検索を行うのか
これを実際に見ていきましょうデータベースの実行計画を見るときには sql 文の
一番手前の方にですね x プーで em
というコマンドをつけたしますたったこれだけでこの sql の実行計画を見ること
ができますでは実際にやってみましょう
ああ
はいするとこのような結果が帰ってきました
これがデータベースの実行計画と言われるものです
はい実はこちらの結果なんですけどもいったいどういう見方をすればいいのかよく
わからないですよね
ですのでこの x プレインの結果をどうやって見ればいいのか解説していきます
それではこちらのエクスプレインの読み方について解説していきます
エクスプレインの結果は正直読みづらいです
ですので初めのうちはこういったリファレンスを見ながらですね
これはどういう意味なのかなというのを調べながら
解読していくことになります
今回はわかりやすいリファレンスとしてこちらの記事とあともうひとつこちらの記事
ですね
2つのリファレンスを用意しました
この2つの記事は概要欄に貼っておくので皆さんも参考にしてみてくださいそれでは
これらのリファレンスを使いながらですね
こちらのエクスプレインの結果を一緒に解読していきましょう
まずはこちらの id ですがこれは sql の実行順序を表しています
今回は単純に1本だけの sql なので id は一番と書いてあります
次にこちらのセレクトタイプですがこれはクエリの種類を表しています
今回はシンプルと書いてあります
これがどういう意味なのかこちらのリファレンスで確認してみましょうするとこのよう
にですね
シンプルは単一の艇ブルーと書いてあります今回
はショップステイブルーという単一のテーブルに対してのクエリですのでこのように
シンプルと表示されています
このクエリがですねもう少し複雑なサブクエリなどになってくるとですね
他にもプライマリーだったり寒く edit いった値がここに表示されるようになり
ます
こういった感じで政府とタイプのところにはクエリの種類が表示されるようになってい
ます
次にテーブルですがショップ数という値が表示されています
これは単純に対象のテーブルが表示されています
今回はショップステーブルに体質のクエリだったので
底部のところにはショップ数と表示されています
次にタイプですがここにはレフト書かれています
べ風とはどういう意味なのかリファレンスを見てみるとコーストではないインデックス
を使って
10日検索を行った時に使用されるアクセスと書いてあります
何のことやらちょっとわからないですよねコーストっていうのはですね
こちらに書いてあるようにプライマリーキーもしくはユニークキーを使用した
検索の場合はこの const という値が表示されますそしてこのコースとではない
つまりプライマリーキーカーユニークキーではないインデックスを使った検索
これがレフに
います
そして10日検索と書いてありますがこれはウエア
型コール v みたいな感じでこの=つまりズバリ値を指定した場合の検索ですねこれ
が10日検索です
今回の場合はユーザー id =にと書いてありますので10日検索
ということになります逆に10日検索ではない
パターンというなんですね例えばこんな感じの比較記号を使ってですね
兄以上とかこういった場合は10日検索ではないパターンになりますということで今回
のこのレフっていうのは何を表しているのかと
いうと primarykey でもユニークキーでもないインデックスを使って
さらに10日検索が行われているということを表しています
次にぽっしゅぶるキーですがこちらは利用可能なインデックス一覧の候補です
そしてキーは実際に今回利用されたインデックスです
今回はインデックスの候補が一つしかなくて
実際にそのインデックスを使用したという形跡がですねこの結果から読み取れます
でここでもし自分が想定していたインデックスが使われてない場合はですね
クエリを見直すなどチューニングのしどころポイントになってくるわけです
次に喜入んですがこちらはキーの長さになります
インデックスを使ってですね検索をするときはこの数字が小さければ小さいほど速く
なってきます
次にレフですがこちらはキーに対してどのような検索を行っているのかを表しています
今回はユーザー id =にのように
ズバリ決まった値を指定していますこういった場合は
const と表示されます次にローズですがこちらはフェッチされるぎー
総数の見積もりになります大体これぐらいの行が検索にヒットするだろうなという予想
になります
最後にエクストラですがこちらはオプティマイザがどのような戦略を立てた彼の補足
情報が表示されることがあります
今回は塗るとなっているので特に追加の情報は得られなかったのですがここまでの全体
の結果を統合してこのインデックスを使って
単純なクエリが走ったんだなあということがこの x プレインの結果から読み取る
ことができます
それではここで改めてあなたに質問します
sql が遅いなーと思っ
たときにあなたならどうしますか
津波に私はサイバーエージェントの面接でこの質問をされたときには次のように答え
ました
sql のパフォーマンスが悪いときにはまずはインデックスを張ることを考えます
ですが
インデックスを張ってもパフォーマンスが改善しない場合にはそのインデックスが本当
に使われているのかを疑いますですので次にやることは
エクスプレインでオプティマイザの実行計画をチェックします
インデックスが意図通りに使われているのかをチェックして
もし想定外の動きをしているのであればクエリーの見直しなどを行います
はいこんな感じで答えた曲があります罪に誤解のないように言っておくと私は別に
サイバーエージェントで働いていたというわけではなくてですね
ses の連接をする機会があってですねこういう
そうされたことがあります
今回ですねこういった面接の質問だったりとかあとは私が
受け答えした内容だったりっていうところはですねこの動画を観ていただいたことで皆
さんも会話の内容は理解できるようになったのではないかと思います
オプティマイザとは何なのか実行計画とは何なのか
この意味が分かっただけでもですね皆さんはすごく
レベルアップできているので自信を持ってくださいこのチャンネルでは過去動画で
インデックスについてパーティションについてなど様々な解説を行ってきました
そしていよいよ次回の動画ではそれらの総集編としてデータベースのパフォーマンス
チューニングのやり方というテーマであなたのスキルをさらにレベルアップできる動画
を公開しますので今のうちにチャンネル登録をして次回の動画を期待ください
そして今回の動画で何か1つだけでも学ぶことができたという方はですね
お願いします動画を閉じる前に高評価のグッドボタンをポチッと押してあげてください
さらにコメントもうしていただけたら嬉しいですそれではまた
th
ええええええ
いいえ
ええええええ
ん
ten
tee
ん
ええええええ
5.0 / 5 (0 votes)