MySQL を詳しく学びたい場合は、マクロ アーキテクチャから始める必要があります。この記事では、MySQL クエリ ステートメントを実行するプロセスを学びます。皆さんのお役に立てれば幸いです。
#この記事の MySQL バージョンは 8.0.18です
#アーキテクチャ図
パーサー
パーサーの機能は、クライアントから送信された SQL ステートメントに対して次の作業を実行することです:
文法解析: SQL ステートメントの構文、括弧や引用符が閉じられているかどうかなどをチェックします。
- 字句解析: SQL ステートメント内のキーワード、テーブル名、フィールド名をノードに分割します。そして最後に解析ツリーを取得します
-
プリプロセッサ
パーサーは主に文法と語彙をチェックしますが、文法がと lexicon は正しいが、 table 、 field が存在しない場合、この SQL ステートメントは正しく実行できません。
したがって、プリプロセッサの役割は次のとおりです:
セマンティック解析
、解析ツリーのセマンティクスが正しいかどうか、およびテーブルとフィールドが存在するかどうかを判断します。前処理の後、新しい解析ツリーが作成されます。得られた。
クエリ オプティマイザー
クエリ オプティマイザーの構造
MySQL における SQL 文の実行方法は次のとおりです。最終的には同じ結果が得られますが、
オーバーヘッドに違いがあります
。選択される具体的な実行方法は、クエリ オプティマイザーによって決定されます。例:
テーブルには選択できる複数のインデックスがあります。どのインデックスを選択する必要がありますか?
- 複数のテーブルに対して関連するクエリを実行する場合、どのテーブルのデータを選択する必要がありますか?ベンチマーク テーブルの場合
-
クエリ オプティマイザーはコストベースのオプティマイザーです。
その動作原理は、解析ツリーに基づいてさまざまな実行プランを評価することです。実行方法 は、最終的に最終ソリューション として最小コストの実行計画を取得します。 ただし、インデックスを使用する必要があるが、テーブル全体のスキャンが実行されるなど、オーバーヘッドが最小のこの実行方法が必ずしも最適な実行方法であるとは限りません。クエリオプティマイザーには「最適化」という言葉がありますが、この最適化は万能ではなく、むしろSQL文が合理的に記述されているかどうかを考慮する必要がある場合が多いです。
論理クエリの最適化
論理クエリの最適化は、主にリレーショナル代数を実行して SQL ステートメントを最適化し、それによって SQL ステートメントの実行をより効率的にする役割を果たします。論理クエリの最適化を簡単に理解するために、いくつかのケースを使用します。
サブクエリのマージ
マージ前SELECT * FROM t1 WHERE a1<10 AND (
EXISTS(SELECT a2 FROM t2 WHERE t2.a2<5 AND t2.b2=1) OR
EXISTS(SELECT a2 FROM t2 WHERE t2.a2<5 AND t2.b2=2)
);
マージ後
SELECT * FROM t1 WHERE a1<10 AND (
EXISTS(SELECT a2 FROM t2 WHERE t2.a2<5 AND (t2.b2=1 OR t2.b2=2)
);
Mergeクエリ条件を結合することで複数のサブクエリを実行し、複数の接続操作を 1 つのテーブル スキャンと 1 つの接続に削減します。
同等の述語の書き換え
ファジー クエリと同様に、%は、インデックス範囲クエリが実行される前に、条件の後に書き込まれます。実際、これはクエリ オプティマイザーの功績です。-
使用される条件はすべて、書き換え前にインデックス付けされていると仮定します
SELECT * FROM USERINFO WHERE name LIKE 'Abc%';
書き換え後
SELECT * FROM USERINFO WHERE name >= 'Abc' AND name < 'Abd';
これが、インデックス範囲クエリに対する答えの理由です
条件付き単純化
条件付き単純化も使用されます。いくつかの方程式と代数関係は、次のことを達成するために使用されます。単純化-
式内の冗長な括弧を削除し、
((a AND b) AND (c AND d))
など、構文分析中に生成される AND ツリーと OR ツリーのレベルを削減します。 a AND b AND c AND d-
定数転送 (例: col1 =col2 ANDcol2 = 3
)は col1 = 3 ANDcol2 に簡略化されます。 = 3-
式の計算。col1 = 1 2
など、直接解くことができる一部の式は最終的な計算結果に変換されます。 col1 = 3 の場合の簡略化-
##物理クエリの最適化
物理クエリの最適化の主な作業は、複数の実行のコストを評価する SQL ステートメントに基づいています。それぞれ計画を立てます
物理クエリの最適化は主に次の問題を解決します:
単一テーブル スキャンで最もコストが低い方法はどれですか? (インデックスをテーブルに戻すスキャンまたはテーブル全体のスキャン) )
- テーブル接続がある場合、どの接続方法を使用するのが最も低コストか
- 簡単なコスト評価について学びます。コスト評価は次のとおりです。
スキャン方法
コスト評価式 | | シーケンシャル スキャン
N_page * a_page_IO_time N_tuple * a_tuple_CPU_time
| インデックス スキャン | C_index N_page_index * a_page_IO_time
|
上記のパラメータは次のように説明されます:
- a_page_IO_time、データ ページをロードする IO 時間は
- N_page、データ ページの数は
- N_tuple、タプルの数 (タプルはデータの行として理解されます)
- a_tuple_CPU_time、データ ページからのタプルの解析に費やされる CPU 時間は
- C_index、IO 時間ですインデックスに費やされるコストは
- N_page_index、インデックス ページです。 数量
インデックス コストの計算については、次の記事を参照してください。MySQL クエリがこれを使用することを選択した理由索引? ——MySQL 8.0.22 のインデックス コスト計算に基づく
実行プラン
実行プランはクエリ オプティマイザーの成果物であり、最終的には引き継がれます。実行のためにストレージ エンジンに送信されます。実行計画は、MySQL がこの SQL ステートメントをどのように実行するかを知るのに役立ちます。
explain
キーワードを使用して SQL ステートメントの実行計画を表示すると、次の情報を取得できます。
- id: SQL ステートメントの実行順序ネストされたクエリ内のクエリ
- possible_keys: このクエリで使用できるインデックス
- Key: 実際に使用されるインデックス
- rows: 取得する必要があるデータのおおよその行数結果を取得するには
- select_type many テーブル間の接続タイプ
- extra: 追加情報、インデックス カバレッジ、インデックス プッシュダウンなどがあるかどうか。
ストレージ エンジン
MySQL サーバーは、データの保存、抽出、更新方法に関する仕様を規定しています。この仕様はストレージ エンジンによって実装されます。ストレージ エンジンごとに実装方法が異なるため、ストレージ エンジンごとにその仕様が示されます。ユニークな機能と特徴。最も一般的に使用されるストレージ エンジンは InnoDB と MyISAM です。
これら 2 つのストレージ エンジンの特徴について簡単に説明します。
InnoDB:
- 外部キーとトランザクションをサポートします。データの整合性と一貫性を向上させます
- より細かいロック粒度、ロックのより適切な制御、より高い読み取りと書き込みの効率をサポートします
MyISAM
- Doesトランザクションはサポートせず、行ロックのみをサポートし、読み取り専用データのシナリオに適しています
ストレージ エンジンは当面拡張されず、引き続き比較が散在します。 InnoDB でのデータ更新プロセスの分析
概要
以前は、SQL の書き方しか知りませんでした。クライアント ソフトウェア上でステートメントを実行し、クリックして実行し、データを取得します
クエリ ステートメントが MySQL サーバーに渡された後、この一連の操作を実行する必要があることがようやく理解できました
- #パーサーはこの SQL ステートメントの構文と語彙をチェックし、エラーがなければ、キーワードに従ってノードに分割され、最終的に解析ツリーが形成されます
- プリプロセッサは、SQL ステートメントのセマンティクスをチェックし、SQL ステートメントがあいまいかどうか、フィールドなどをチェックして、新しい解析ツリーを形成します
- クエリオプティマイザーは、この解析ツリーによって生成されたさまざまな実行プランを取得し、論理クエリの最適化と物理クエリの最適化の後に取得します。 オーバーヘッドが最小限の実行プラン
- 実行エンジンは、この実行プランを取得して呼び出します。ストレージ エンジン インターフェイス
- ストレージ エンジンは実行プラン クエリに従ってデータを処理します。クエリはオペレーティング システムのファイル システムのいくつかのインターフェイスをクエリして呼び出し、データ クエリを完了します。そして最後にクライアントに戻ります
[関連する推奨事項: mysql ビデオ チュートリアル ]
以上がMySQL がクエリ ステートメントの実行プロセスについて学習するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。