文章はMySQLクエリ文の実行過程を理解します。


前言
データベースからいくつかの要求に合ったデータを検索する必要があります。私たちはSelect A B FROM T WHERE ID=XXを書きやすいです。  このようなSQLは、データベースにこのような要求を送信すると、データベースは一体何をしていますか?
今日はMYSQLを例にとって、MySQLデータベースの照会プロセスを掲示して、データベースの中のいくつかの部品について理解させます。
MYSQLアーキテクチャ

mysqlアーキテクチャ
MySQLは主にServer層と記憶エンジン層に分けることができます。
Server層はコネクタ、クエリーキャッシュ、アナライザ、最適化器、アクチュエータなどを含み、すべてのトランジットエンジンの機能はこの階で実現されます。例えば、記憶プロセス、触発器、ビュー、関数など、汎用的なログモジュールbinlogログモジュールがあります。
記憶エンジン層はデータの保存と抽出を担当する。このアーキテクチャはプラグイン式で、InnoDB、MyISAM、メモリなど複数の記憶エンジンをサポートしています。現在最もよく使われている記憶エンジンは、MySQL 5.5バージョンからデフォルトの記憶エンジンとなります。
コネクタ
コネクタは主にユーザーがデータベースに登録し、ユーザーの身分認証を行います。アカウントのパスワード、権限などの操作を確認します。
パスワードが間違っていると、「Access denied for user」というエラーが発生し、クライアントプログラムが終了します。
ユーザーアカウントのパスワードが通過した場合、コネクタは権限テーブルにそのユーザの権限を確認します。その後、この接続における権限論理判断はこの時に読み取った権限データに依存します。つまり、その後はこの接続が継続的に開かれている限り、即時管理者がそのユーザの権限を変更しました。このユーザも影響を受けません。
クエリーキャッシュ(Query cache)
クライアントとサービスとの接続が確立された後、MySQLはクエリ文を実行する際にキャッシュに問い合わせて、このSQLが前に実行されたかどうかを確認します。前に実行した文とその結果はkey-valueペアとしてメモリに直接キャッシュされます。keyはクエリの文で、valueはクエリの結果です。もしあなたのクエリがこのキャッシュに直接keyを見つけることができれば、このvalueは直接クライアントに返されます。命中していない場合は、その後の操作が必要です。完了後も結果をキャッシュして、次の呼び出しに便利です。
ここを見たら、みんなが目の前が明るくなりますか?この機能がうまく利用したい衝動がありますか?
実はここではクエリーキャッシュを使用することを提案していません。キャッシュの失効は非常に頻繁です。テーブルの更新があれば、この表にあるすべてのクエリーキャッシュはすべて空になります。そのため、苦労して結果を保存することができます。まだ使っていないのに、一つのアップデートで全部クリアされました。更新圧力が大きいデータベースでは、クエリキャッシュの命中率は非常に低いです。長い間更新されないようなテーブルでない限り、システム構成表などですが、このようなシステム構成は私達が配置プラットフォームに置くのはよくないですか?
MYSQL 8.0では既にクエリキャッシュという機能が削除されていますが、公式ではこの機能は実際のアプリケーションシーンでは少ないと考えていますので、そのまま削除しました。
アナライザ
Mysqlは検索キャッシュに命中していないので、分析器に入ります。分析器は主にSQL文を分析するために使います。分析器は主に以下の2つのステップに分けられます。
  • ワード分析:SQL文には複数の文字列があります。まずキーワードを抽出します。例えば、select、クエリのテーブルを提出します。フィールド名を提出します。検索条件を提示します。
  • 文法分析:語法分析の結果、文法分析は主にあなたが入力したSQL文が正しいかどうかを判断し、MYSQL文法に合っているかを判断します。もしあなたの文が間違っていると、「You have an error in your SQL sysntax」というエラーメッセージが届きます。
  • 語法分析プログラムは検索語句全体を各種類の標識に分解し、文法分析は定義されたシステム言語に基づいて「各種標識」をMySQLに対して意味のある組み合わせに変えます。最後のシステムは、構文ツリー(AST)を生成し、構文ツリーは、最適化器に依存するデータ構造である。
    最適化器
    分析器を通して、MySQLはあなたが何をしたいのか分かります。実行を開始する前に、先に最適化器の処理を経なければなりません。
    なぜ最適化器が必要ですか?
  • 最適化器には多くの複雑な最適化技術が含まれており、これらの最適化技術は最も良いプログラマが把握するものよりも多い。システムの自動最適化は、すべての人がこれらの最適化技術を持つようにすることに相当する。
  • 最適化器は、テーブルの行数、テーブルの各列の分布など、多くの統計情報をデータ辞書から取得することができる。最適化器最適化器は100種類の異なる実行計画を考慮することができ、プログラマは一般的に限られたいくつかの可能性しか考慮できない。
  • は、これらの情報に基づいて効率的な実行計画を選択することができ、ユーザプログラムは、これらの情報を取得することが困難である。
  • つまり、最適化器は文法分析ツリーの形態を修正し、文法分析ツリーを照会ツリーに変えて、実行方案を確定する。
    アクチュエータ
    MySQLは分析器であなたが何をしたいのかを知りました。最適化器でどうすればいいのかを知りました。するとアクチュエータの段階に入り、ステートメントの実行を開始しました。
    実行を開始するときは、ユーザーがクエリを実行する権限があるかどうかを確認してください。ない場合は、権限がないエラーを返します。権限があれば、エンジンのインターフェースを呼び出して、インターフェースの実行結果を返します。
    ステートメント分析
    次の実際のSQLクエリ文でMYSQLクエリの実行過程を分析します。
    
    select id,name,sex,phoone from user t where t.age='26' and t.account='javadaily'
    
    
  • は、まずクライアントがデータベースに接続する必要があります。もしアカウントのパスワードが間違っていたら、直接にエラー情報に戻ります。正しいなら、次のステップに進みます。
  • MYSQL 8.0の前にキャッシュに問い合わせて、このSQL文をkeyとしてメモリで結果があるかどうかを調べます。もしあれば、権限があるかどうかを先に判断し、権限があればクライアントに戻ります。そうでなければエラーを報告します。クエリキャッシュからヒットしていない場合は、次のステップ
  • に進む。
  • は分析器によって語法分析を行い、sql文のキー要素を抽出し、例えば上記の文を抽出することはselectであり、抽出に必要なクエリーのテーブル名はuserであり、クエリが必要な列はid、name、sex、phooneであり、照会条件はage=26とaccount=javadaillyである。このsql文に文法的な誤りがあるかどうか、例えばキーワードが正しいかどうかなどを判断して、問題がないなら次のステップを実行します。
  • 上のSQLには、最適化アルゴリズムに基づいて実行効率が最も高いaスキームを選択する2つの実行方式があり、最適化スキームが決定されたら実行を開始する。
  • a.account=javadailyのユーザーを調べて、ageが26 bに等しいかどうかを判断します。まず、age=26のユーザーを探して、account=javadailyのユーザーを調べます。
  • は権限検証を行い、クエリ権限があればデータベースエンジンインターフェースを呼び出して実行結果を返します。そうでないとエラーが発生します
  • 締め括りをつける
    この記事でMySQLクエリ文の実行過程を把握した記事を紹介します。MySQLクエリの実行過程については、以前の記事を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。