MySQLのインフラストラクチャ、およびSQL文の実行プロセス

01. MySQLのインフラストラクチャ

どのようにSQL文を実行しています

SQL文からインフラのmysqlについて学ぶには、実行する方法を学ぶことです。

一般的に、我々は次のようなクエリを記述します。

select user,password from mysql.user;

これは、結果を返しますが、私はこの文の実行の内部流れを知りません。

以下は、ロジックチャートmysqlのです:

1567066796748

MySQLサーバは、2つの部分と、記憶層のエンジン層に分けることができます。

コア機能のMySQLの多くのサーバ層のコネクタ/キャッシュ/アナライザ/オプティマイザ/アクチュエータカバー。

デフォルトのストレージエンジンのバージョンMysql5.5はInnoDBがある後にストレージエンジン層は、データ等の保存と検索、サポートInnoDBは、MyISAMテーブル、メモリ、ブラックホール、責任があります。

次に、層ごとに、我々は、実装プロセスのSQL文を見てください。

1)コネクタ

まず、mysqlクライアントは、コネクタに接続されて接続、コネクタが接続を確立する責任がある/許可を取得するには、クライアントとユーザーIDを確認します。次のように接続コマンドは、一般的に次のとおりです。

mysql -h ip地址 -P 端口 -u 用户 -p

クライアントが接続の始めの上にユーザー名とパスワードを入力すると、コネクターがチェックします。

  • ユーザー名またはパスワードが間違っている場合、クライアントは「アクセスがユーザーのために拒否されました」エラーが表示されます。
  • 正しいユーザー名とパスワードを検証した場合、コネクターは、ユーザーが持っている権限を確認します。その後、この時に読み込ま接続許可ロジックに依存権利です。

これは、ユーザーの接続が正常に確立された後にすることを意味し、ユーザーの変更に管理者権限を使用していても、それはユーザーの接続と切断しない限り、接続しているユーザーには影響しません。ましょうコネクタは専用権限を再読み込みすることができます。

2)クエリキャッシュ

接続が確立されたら、他のステートメントを実行するために選択することができ、そしてそれは第二段階になります。クエリキャッシュ

MySQLのSQLは、要求を受信した後、最初にそれが適用されるかどうかを確認する前にキャッシュをチェック。実行され、キャッシュの有効期限が切れていない場合、結果はメモリに保存されたキー値になり、キーがクエリで、値は、クエリの結果です。キャッシュがある場合は、直接対応する値にクライアントに返されます。

文はクエリキャッシュにない場合、実行が完了した後に、キャッシュになり、次のステージを下に実行します。

クエリキャッシュの有効期限は非常に限り、テーブルを更新するよう、すべてのクエリキャッシュの結果の後、テーブルがクリアされますので、通常、それほど頻繁に変更テーブル、クエリキャッシュのヒット率が非常に低いです。テーブルのデータが比較的安定していない限り、それだけでクエリキャッシュのために、頻繁に変更されません。

理解の下で:Mysql8.0バージョンの後に、クエリキャッシュ機能が削除されました。

3)アナライザ

キャッシュは無用ヒットした場合、アナライザは、SQL文の解析に取り組み始めました。

あなたは、スペースのSQL文を入力し、「字句解析」を行いますまずアナライザ、プラスより多くの文字が、アナライザは何も代表から内部の各文字を分析する必要があります。

「選択」あなたが入力したキーワードが開始すると、mysqlのこれは、クエリで知っている、そしてそれは、テーブル名であるあなたが入力した条件である、というように分析します。

字句解析行われ、字句解析の結果によると、「パース」やって起動、構文解析では、このSQL文は、MySQLの構文を満たして入る判断させていただきます。

あなたの文が間違っている場合は、この文は、文字「S」の冒頭で数十人を選択した場合、エラーリマインダー「あなたはあなたのSQL構文でエラーが発生している」を受け取ることになります。

mysql> elect * from stu;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'elect * from stu' at line 1

一般的な構文エラーが最初に表示されるエラーを促すメッセージが表示されますので、あなたが集中する必要があり、「近い使用」の内容のすぐ後ろにあります。

4)オプティマイザ

解析の後、MySQLはすでにあなたがしなければならないものを知って、そして開始する前に、またオプティマイザを処理する必要があります。

最適化テーブル時間インデックスが複数存在する、インデックスが使用されるかを決定する、またはステートメントに関連する複数のテーブルは、各テーブルの接続順序を決定します。

5)アクチュエータ

あなたが何をすべきか知っているアナライザによるMySQLの、行う方法を知って、次のステップは実行がオプティマイザによって文の実行を開始です。

作業を開始する前に、まずノーリターン権限エラーがない場合は、リストやライブラリは、動作する権限を持っていないかを決定する必要があります。

あなたが権限を持っている場合は、継続してテーブルを開きます。テーブルの定義に基づいてエンジンアクチュエータは、エンジンへのインターフェースを使用する場合、テーブルを開きます。

以下のようなselect文:ID = 100 DB1から選択*;

  • 最初の行は最初にそれがスキップされていない場合、テーブルIDの値が100を決定していない取得するためにInodbエンジンインタフェースを呼び出し、その結果が結果セットに存在する場合。
  • エンジン・インターフェース・コール・アクセス「次の行」、この表の最後の行が読み出されるまで、論理は同じ決意を繰り返します。
  • アクチュエータは、クライアントに必要なプロセスを満たすために、すべての上に横断します。

これまでのところ、このselect文が完成し実行します。

rows_examinedフィールドが表示されますスロークエリログデータベースには、ステートメントは、実装プロセスは、行数をスキャンすることを示しています。この値は、アクチュエータに蓄積されたときにデータ線エンジンを取得するために、各コールです。

いくつかのケースでは、エンジンの内部に一度呼び出さアクチュエータは、スキャンエンジンが正確rows_examinedと同じ行数ではなく、マルチラインスキャンです。

Mysqlの、このような論理構造と何度も繰り返しプロセスは、私はまた、SQL文全体の実装プロセスの様々な段階の予備的な理解を持っています。私はあなたが私たちを助けることができると思います。

おすすめ

転載: www.cnblogs.com/Tao9/p/11431014.html