MySQLの構造(ステートメントの実行)

一般的に、MySQLは二つの部分と、記憶層Serverエンジン層に分けます。

サーバレイヤは、コネクタ、クエリキャッシュ、アナライザ、アクチュエータなどを含むすべての組み込みおよびクロス機能ストレージエンジン(例えば、日付、時刻、および暗号化された数学関数など)の機能(例えばストアドプロシージャとして、トリガ、ビュー)

ストレージエンジン層は、データの保存と検索、InnoDBは、MyISAMテーブル、メモリのサポート、およびその他のストレージエンジンを担当しています。デフォルトのストレージエンジンのMySQLの5.5.5バージョンの後のInnoDBに格納されます。

 

コネクタ(コネクタ)

SQLクエリの前に、確かに最初のコネクタによって行われているのMySQLとの接続を確立する必要があります。コネクタは接続を維持し、管理し、アクセス権限をクライアントとの接続を確立する責任があります

クライアント全く動きがあまりにも長い間、接続が自動的に切断されません場合は、この時間をWAIT_TIMEOUTがパラメータによって制御され、デフォルト値は8時間です。クエリ中のMySQLサーバへの接続が失われた:接続が切断された後、クライアントが要求を再送信し、場合は、エラー通知を受け取ることになります。

ロングとショートの接続コネクタ

クライアントが要求し続けている場合、接続が成功したデータベース、長い接続手段の内部では、同じ接続を使用しています。

ショート接続が切断数回を終了し、クエリの各実行を意味し、次のクエリを再作成します。

接続を確立するプロセスは、長い間接続を使用しようとすると、接続を確立する行為を削減しようとするために使用することが推奨され、多くの場合、より複雑です。実行中に使用MySQLの一時メモリが接続オブジェクトの内部を管理することがあるので、しかし、すべての使用長い接続した後、MySQLは時々、メモリを取るはるかに高速に上昇しました。切断された場合にのみ、これらのリソースは解放されます。限り接続が蓄積した場合、メモリフットプリントにつながることができ、システムはそのMySQLの異常な再起動を確認する現象から、(OOM)を殺すためには大きすぎる強制されています。

どのようにこの問題を解決するには?次の2つのシナリオを検討してください。

1:長いリンクが定期的に壊れています。時間の期間の後、または照会のために大量のメモリを決定し実行するプログラム、切断、再度クエリに再接続します。

2:MySQLの5.7以降、比較的大きな操作のそれぞれの後に実行されてもよいmysql_reset_connectionリソースを行うことにより、接続を再初期化します。このプロセスは、再配線が必要ですし、検証機関を再実行しますが、接続は状態だけで完成作成に復元されますされません。

 

クエリキャッシュ(クエリキャッシュ)

接続が確立された後、彼らは、SELECT文を実行するために、実行前になります最初のクエリキャッシュを開始します。

GET MySQLのクエリの後、最初に表示されるクエリキャッシュは、この文を実行されません。ステートメントが実行され、結果を形成するために、メモリキーと値のペアの特定の領域に保存されています。キーの文は、値がクエリの結果である、クエリです。あなたがキャッシュに直接キークエリを見つけることができれば、その値は、クライアントに直接返されます。

キャッシュは、その理由をミス:

クエリは、クエリがあまりにも多くのキャッシュではない不確実性、またはクエリの機能が含まれているためか、キャッシュすることはできません

MySQLはこのクエリを扱われたことがありません

キャッシュの前に、しかし、クエリキャッシュメモリがなくなる、彼が追放されました

クエリキャッシュはまだ完了してウォームアップ、MySQLのクエリ結果がキャッシュされるために十分な時間ではありませんではありません

このよう破片、メモリ不足、データ変更をキャッシュとしてあまりにもキャッシュ無効化操作は、キャッシュ・ミスになります

最適化:

断片化を削減し、右query_cache_min_res_unitのは、廃棄物に起因するメモリの断片化を減らすことができます選択

クエリキャッシュの使用率を向上させます

適切な粒子サイズの代わりに一つの大きなテーブルの小さな複数のテーブルと

ただ、一括キャッシュ無効化書き込みを行うシングルに比べて優れた効率を書きます

期限切れの操作は、サーバーの死者を引き起こす可能性がある場合は、キャッシュがあまりにも多くのスペースを、避けるためにあるため、バッファ領域のサイズを制御

 

文がクエリの実行フェーズをキャッシュされていない場合、それは背後に継続されます。実行が完了すると、結果がクエリキャッシュに格納されます。クエリキャッシュヒットした場合、MySQLは後で複雑な操作を実行する必要はありません、あなたは、直接結果を返すことができ、効率が向上します。

しかし、クエリキャッシュの有効期限は非常に頻繁に限り、テーブルに更新があるとして、このすべては、テーブル、クエリキャッシュが空になっているになります。大規模なデータベースの更新の圧力は、クエリキャッシュのヒット率が非常に低いです。あなたがビジネスの静的リストを持っている必要がある場合は、それが毎回更新されます。例えば、システム構成テーブル、使用クエリキャッシュに適しており、このテーブルにクエリ。MySQLは、このオンデマンドの使用を提供します。デフォルトのSQL文がクエリキャッシュを使用しないためQuery_cache_typeパラメータは、DEMANDに設定することができます。あなたは必ずクエリキャッシュ文を使用するために、次のように明示的に、SQL_CACHEを指定することができます。

MySQLは> ID = 1 USER_INFOから* SQL_CACHEを選択します。

 

アナライザ(分析)

クエリキャッシュミスした場合、我々は文を開始する必要があります。まず、MySQLは、SQL文を解析する必要があります。

まずアナライザは、字句解析を行います。SQL文は何の代表文字列と複数の空間、それぞれ、文字列の中にあるものを識別するために、MySQLの必要性、で構成されています。あなたが入力した選択キーワードから特定のMySQLは、このクエリです。また、テーブル名、列名として特定文字列ID USER_INFO文字列として認識されるべきです。それを行うために解析した後。字句解析の結果によると、文法パーサの規則に従って入力SQLステートメントは、MySQLの構文を満たしているかを決定します。

あなたのSQL文が間違っている場合、あなたはあなたがあなたのSQL構文エラーリマインダのエラーを持って受け取ります

 

オプティマイザ(オプティマイザ)

字句解析と構文解析アナライザ、だけでなく、治療オプティマイザ後。

時間インデックスが複数あり、最適化テーブルは、インデックスが使用されるかを決定する、またはステートメント(参加)に関連付けられている場合、複数のテーブル、各テーブルの接続の順序を決定します

 

アクチュエータ(アクチュエータ)

実装の初めには、最初にされていない場合、それは許可なしにエラーを返しますが、このテーブルにクエリを実行する権限がありませUSER_INFOかを判断しなければなりません

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

公開された50元の記事 ウォンの賞賛2 ビュー2267

おすすめ

転載: blog.csdn.net/eafun_888/article/details/104738590