1. マクロの観点からMySQLを分析するまず、典型的な図( MySQL論理アーキテクチャ図)を見てみましょう。 上の図のクライアントは、PHP、Java などとして直接理解できます。次に、接続とスレッドの処理について説明します。この部分は MySQL に固有のものではなく、ほとんどのクライアントとサーバーは同様の構造になっています。 したがって、一般的に言えば、MySQL はサーバー層とストレージ エンジン層の 2 つの層に分けられます。 サーバー層には、主に、接続層、クエリ キャッシュ、アナライザー、オプティマイザー、エグゼキューターなどの重要なモジュールが含まれます。この層には、よく使用されるフォーマット時間、暗号化などの MySQL コア API 部分も含まれます。 面接中に Innodb と Myisam ストレージ エンジンの違いについて何度も質問しているので、ストレージ エンジンについては皆さんよくご存知だと思います。 では、MySQL にこれほど多くのストレージ エンジンがある理由について考えたことはありますか? すべてのテクノロジーは現在の問題から生まれており、MySQL も例外ではありません。 MySQL のストレージ エンジンのアーキテクチャはプラグイン ベースであるため、任意に切り替えることができ、固定されていません。また、MySQL バージョン 5.5 のストレージ エンジンは、デフォルトですでに Innodb になっています。 2. SQL ステートメントを実行するには、どの程度の困難が必要ですか?MySQL の詳細なアーキテクチャ図 図には、おなじみの奇妙なクエリ キャッシュ モジュールも示されていますが、これは MySQL 8.0 では存在しなくなりました。 まず、このアーキテクチャ図で SQL ステートメントがどのように機能するかを概観します。 2-1 コネクタmysql -u root -p データベースコマンドに接続します。実行後、パスワードを入力する必要があります。従来の TCP ハンドシェイクが完了すると、コネクタが機能します。 コードが正しくない場合は、ユーザー 'root'@'localhost' のアクセスが拒否されました (パスワードの使用: YES、エラー コード 1045) が返されます。 接続情報が正しければ、入力したユーザー アクセス権限テーブルに基づいてユーザーの権限が取得されます。ここで明確にしておく必要があるのは、正常にログインした後、他のユーザーが権限を変更しても、接続が切断されるまで権限は変更されないということです。 接続が完了したら、何もせずに show processlist を実行すると、空の接続を示す sleep が表示されます。 接続が成功した後に操作が実行されない場合、MySQL が自動的に切断されるまでにどのくらいの時間がかかるかご存知ですか? 時間を表示するには、「wait_timeout」のような show variables を実行します。 MySQL では、特別な説明がない限り、すべての時間は秒単位です。時間変換によると、空の接続は 8 時間続くことがわかります。 2-2 クエリキャッシュ注意すべき点は、MySQL 8.0 がキャンセルされたことです。この問題は何度も言及されています。特に、8.0 未満の MySQL バージョンを使用している友人は注意が必要です。 8.0 に切り替えると、この問題が発生する可能性があり、解決方法がわからない場合があります。 MySQL 8.0 がクエリ キャッシュ モジュールをキャンセルする理由 このモジュールの設計では、クエリ ステートメントをキーとして使用し、結果をキャッシュの値として使用します。テーブルが更新されると、以前のキャッシュはすべてクリアされます。それは、一生懸命書いたコードが提出後に他の人によって上書きされるのと同じくらい辛いことです。 MySQL バージョン 8.0 未満では、クエリ キャッシュを使用するかどうかを制御するためのパラメータ query_cache_type = enmand が提供されています。設定後、デフォルトの選択ステートメントはキャッシュされません。 一部のシナリオで機能する場合は、select キーワードの後に sql_cache を追加できます。 選択ステートメントが以前にキャッシュされている場合、結果セットはここで直接返されますが、キャッシュされていない選択ステートメントの場合はより困難になり、長い道のりを続ける必要があります。 2-3 アナライザーMySQL 8.0 より前では、アナライザーに入る前にキャッシュするかどうかが決定されます。MySQL 8.0 以降では、検証が成功するとコネクタは直接アナライザーに入ります。 アナライザーは、文字通りの意味によれば、実行される SQL ステートメントが何であるか、そして何を行うかを分析するものです。 たとえば、select * from user where id = 1を実行します。 MySQL はまずこれが select に基づくクエリ ステートメントであると判断し、次に user をテーブル名として、id をフィールド名として識別します。このプロセスは、字句解析と呼ばれます。 次のステップは、SQL 構文が正しいかどうかを確認し、構文分析を実行することです。構文が正しくない場合は、「SQL 構文にエラーがあります」というエラーが表示されます。通常、エラーは使用中の近くで見つかります。 2-4 オプティマイザーこの時点で、MySQL は実行したいことを認識していますが、それを実行するための最適な方法を選択する必要があります。 オプティマイザーは何を最適化するのでしょうか? たとえば、複数のインデックスがある場合にどのインデックスを選択するか、複数のテーブルが関連付けられている場合の接続順序などです。 ここで疑問に思うのは、オプティマイザーは複数テーブルの関連付けの結合順序を最適化するので、SQL ステートメントを記述するときに結合順序を考慮する必要はないのではないかということです。 もちろん違います。MySQL の作業量を減らすことができる場合は、できるだけ減らしてください。それでも、大きなテーブルを動かすには小さなテーブルを使用するのが原則です。 2-5 アクチュエータこの SQL 文は、何をどのように行うかが決定された後にのみ実際に実行されます。最初に権限の検証が行われます。権限がない場合は、権限エラーが直接返されます。権限がある場合は、テーブルに定義されているストレージ エンジンに応じて、対応するエンジンが提供するインターフェイスが使用されます。 実行フローチャート 上の図には、本文中のすべての知識ポイントが含まれており、MySQL 全体の一般的な実行フローチャートでもあります。 これで、MySQL で SELECT ステートメントを実行する方法についての記事は終了です。MySQL の SELECT ステートメントを実行する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Windows Server 2012 でファイル サーバーを構築するための詳細な手順
>>: CSS疑似クラスの右下隅をクリックすると、選択されたサンプルコードを示すチェックマークが表示されます。
目次1. 当初の需要2. 解決策3. 運河の導入と設置運河の仕組み建築インストール4. 検証1. 当...
序文Workbench が 1 台のコンピューターにインストールされており、別の Ubuntu サー...
スペースを購入してウェブサイトを構築したことがある友人なら、ウェブサイトは正式に開設する前に登録する...
js では、ログインまたは登録を確認する前に、ユーザーが特定の契約書を読むように設定します (使用...
質問Docker が elasticsearch をインストールして起動するときにメモリが不足するシ...
MySQLでホワイトリストアクセスを設定する手順1. ログイン mysql -uroot -pmys...
mysql ログインのコマンド形式は次のとおりです。 mysql -h [hostip] -u [ユ...
まずは違いについて話しましょう最後に、書き換えられたルールは、次の場所と一致させるために書き換えられ...
事前に言っておくNodejs はデータベースを非同期操作として読み取るため、データベースがデータを読...
前の記事では、And キーワードを使用した MySql の複数条件クエリ ステートメントを紹介しまし...
高性能分散メモリオブジェクトキャッシュシステムMemcachedについては、別の記事「Windows...
XHTML は現在国際的に推奨されている標準的な Web サイト設計言語です。Webjx.com も...
ウェブページにBaiduマップを挿入するBaidu Maps を自分の Web ページに追加したい場...
これまで、CSS の背景の属性には、color、image、repeat、attachment、po...
vueプロジェクトをパッケージ化してサーバーにデプロイし、正常にログインできるが、ローカルで起動する...