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

TCP / IPは、もうそれを我慢、私はそれは、アプリケーション層から開始することであると考え、次の2ヶ月間、私は私が不慣れされているネットワーク、アルゴリズムとデータベース関連の知識を学ぶことに焦点を当てる、それはプロの本を探します非常に難しい、時間の無駄であると言うことができます、学習目標データベースは、データ構造とアルゴリズムの一つのマスターに、正しいへの最初の方向であり、その後、基礎となるリレーショナルデータベースについて学習します。

 

1行のSQL約ましょう話:

MySQLの> ID = 10 T SELECT * FROM。

 

 

MySQLは2層、サーバーエンジン層とストレージ層に分離することができます。

、コネクタなど、クエリキャッシュ、解析、最適化、アクチュエータなど、MySQLの中核サービス機能のほとんどをカバーするだけでなく、内蔵の(など、日付、時間、数学と暗号化機能など、)機能のすべてのサーバー層、全てのクロスストレージエンジン関数は、ストアドプロシージャ、トリガ、および他のビューとして、この層に実装されています。

ストレージエンジン層は、データ記憶および検索のために責任があります。そのアーキテクチャモデルは、プラグインのInnoDB、MyISAMテーブル、メモリ、およびその他のストレージエンジンのサポート、です。

あなたはエンジンのタイプを指定しない場合、テーブルのテーブル構造を作成、実行時に他の言葉では、デフォルトでは、InnoDBのを使用することです。しかし、あなたはまた、指定されたメモリエンジンを使用してこのようなテーブルを作成するCREATE TABLE文でエンジン=メモリの使用などのストレージエンジンによって指定された他のエンジンタイプを選択することができます。

これは、異なるストレージエンジンは、コネクタ部からアクチュエータにサーバレイヤ、すなわち共有、図から明らかです。

 

コネクタ

mysqlの-h $ IP -P $ポート-u $ユーザー-p
  • ユーザー名またはパスワードが間違っている場合は、「アクセスが拒否されたユーザーのために、」エラーが表示され、クライアントプログラムが実行を終了します。
  • ユーザー名とパスワードの認証場合は、テーブルに接続する権限は、あなたが持っている権限がわかります。この時点では、読み取り権限に依存し、その後、接続許可決意ロジック。

接続に成功した後、ユーザーがあなたが変更されたユーザーの許可の管理者アカウントを使用している場合でも、確立されている。この手段は、それが既存の接続の権利には影響しません。編集した後、その後、唯一の新しい接続は、新しい権限設定を使用します。

接続したら、あなたがフォローアップしていない場合は、アクションを、接続がアイドル状態では、show PROCESSLISTコマンドでそれを見ることができます。これは、コマンド列は、この行に「スリープ」を読み出し、それは自由な接続システムは、今そこにあることを意味し、テキスト図ショーPROCESSLISTの結果です。

 

クライアントが長すぎる運動でない場合は、接続が自動的に切断されます。この時間は、パラメータWAIT_TIMEOUTで制御され、デフォルトは8時間です。

  msyql>設定されたグローバルWAIT_TIMEOUT = 28800;

  msyql>設定されたグローバルは、interactive_timeout = 28800;

クエリ中のMySQLサーバへの接続が失われた:接続が切断された後、クライアントが要求を再送信し、場合は、エラー通知を受け取ることになります。続行する場合は、この時点で、我々は再接続して、要求を実行する必要があります。

長いデータベース接続が成功した接続が行われ、同じ接続のために使用された後、クライアントの要求である、短いリンクが切断再接続を再作成する次の要求を、数回とを要求する時間です。接続が複雑で確立するために、それはあまりにも長い間、接続してみてください、TCPコネクションです。

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

問題への解決策?

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

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

 

クエリキャッシュ

MySQLがクエリ要求を取得するためにした後、クエリキャッシュは、最初の外観は、この文の前に実行されないだろう。これは、文の前に実行され、その結果が直接メモリにキャッシュされたフォームにキーと値のペアであってもよいです。キーの文は、値がクエリの結果である、クエリです。あなたがキャッシュに直接キークエリを見つけることができれば、その値は、クライアントに直接返されます。

テーブルのクエリキャッシュが空になるにクエリキャッシュの有効期限は非常に頻繁に限り、テーブルに更新があるとして、このすべてになります。それはあなたがそれを使用しないように、追いつくのに苦労した結果は、それが空に完全更新した可能性が高いです。大規模なデータベースの更新の圧力は、クエリキャッシュのヒット率が非常に低いです。あなたのビジネスは、静的なテーブルを持つことでない限り、それは毎回更新されます。例えば、システム構成テーブル、使用クエリキャッシュに適しており、このテーブルにクエリ。

デフォルトのMySQLのクエリキャッシュが開いていないですが、あなたは、SQLのショーを指定することができます

MySQLの> ID = 10 TからSQL_CACHE *を選択します。

MySQLの8.0バージョンを直接クエリキャッシュピースの機能は、この機能の完全無料8.0を開始したこと、削除しました。

 

アナライザ

クエリキャッシュにヒットしない場合、あなたは本当に文を実行するために開始する必要があります。まず、あなたがしなければならないものを知っているので、SQL文を解決するために行われる必要があるためにMySQLの必要性。

まずアナライザは「字句解析」を行います あなたの入力は、内部の文字列がどのような代表であるものを識別するための文字列やスペース、MySQLの必要性から複数のSQL文です。

MySQLは、クエリでキーワードを、「選択」あなたの入力から同定しました。また、文字列「T」は「テーブルT」、として特定の文字列「ID」として識別されなければならない「欄のID。」

これらは、それが行われて行わ識別した後、「解析します。」字句解析の結果によると、文法パーサのルールに従って、あなたはこのSQL文は、MySQLの構文を満たして入る判断させていただきます。

あなたの文が間違っている場合は、「あなたは、あなたのSQL構文でエラーが発生している」エラー通知を受信します

「字句解析」と「構文解析」

アナライザは、列名が存在し、上のよう、また、SQL文のテーブル名を解析するための責任があります。

 

オプティマイザ

最適化テーブルが、時間インデックスの複数で使用されるインデックスを判断する;または複数のテーブルステートメント(ジョイン)に関連付けられている場合、各テーブルの接続の順序を決定します。たとえば、あなたは次のような文を実行し、このステートメントは、二つのテーブル結合が実行されます。

(ID)を用いて、T2参加T1からのMySQL> SELECT * FROMここt1.c = 10とt2.d = 20。

使用後者より自由度の差にされている詳細。

  • テーブルT1の開始C = 10個の値が記録されたIDの内部に取り込まれてもよいし、ID値対応テーブルT2に応じて、その後、t2が20 Dに等しい求めた値です。
  • 相関IDに応じて記録されたテーブルT2をスタートさd = ID 20の値、およびその値T1の内部に採取し、次いで10℃に等しいT1の値を決定することができます。

これらの2つの方法の実装の論理的な結果は同じですが、実装の効率が異なることになる、とオプティマイザの役割は、使用するプログラムを決定することです。

オプティマイザ・フェーズが完了すると、プログラム文の実装が確定した後、アクチュエータの段階に入ることにします。

 

アクチュエータ

あなたが何をすべきか知っているアナライザによるMySQLは、我々は彼がアクチュエータの段階に入って、声明を開始、オプティマイザによってそれを行う方法を知っています。

実装の初め、最初の(プロジェクト実施中に、クエリキャッシュヒット場合は、キャッシュを照会しますあなたは、テーブルT上のクエリを実行する権限を持っていないかを判断し、ない場合は以下のように、それは、許可なしにエラーを返しますバックするときの結果は、許可の検証を行う。事前チェックのお問い合わせは)オプティマイザ前に許可を確認するために呼び出します。

MySQLの> ID = 10 T SELECT * FROM 

ERROR 1142(42000):SELECTコマンドは、ユーザ'B' @ 'localhost'のに拒否されたため、テーブル'T'

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

例えば、この例のテーブルTにおいて、IDフィールドは、実行フローアクチュエータはこのされ、索引付けされていません。

  1. エンジン・インターフェース・コール採取のInnoDBテーブルの最初の行は、この行が結果セットに存在する場合、次いで、ない場合はスキップし、ID 10の値ではないと判断します。

  2. インタフェースの呼び出しエンジンは、ロジックは、テーブルの最後の行に到達するまで同じ決意を繰り返し、「次の行」を取ります。

  3. すべての行以上のアクチュエータトラバーサルがクライアントに返された結果セットとして構成される条件セットレコードを満たします。

これまでのところ、実行されたこの文は完了です。

インデックスを持つテーブルの場合は、ロジックは同じ程度行きました。最初の呼び出しは、このインタフェースは、エンジンであるインタフェースが定義されている「次の行の条件を満たすように、」サイクルを受けた後、「最初の行の条件を満たすように取られ」ました。

あなたは、文の実行スキャン処理することを行の数を示す、スロークエリログデータベースにrows_examinedフィールドが表示されます。この値は、アクチュエータに蓄積されたデータ線エンジンを取得するために、各コールです。

いくつかのシナリオでは、エンジンの内部に一度呼び出さアクチュエータは、マルチライン走査ライン数が正確に同じではないrows_examinedとスキャンエンジンです。我々は詳細に説明されるエンジンの観点からの資料を、保存するための特別な内部機構を持つことになりますよう。

 

"MySQLの戦闘" - 林Xiaobin

 

おすすめ

転載: www.cnblogs.com/CherryTab/p/12008073.html