コード標準では、SQL ステートメントに結合が多すぎないようにする必要があるのはなぜですか?

コード標準では、SQL ステートメントに結合が多すぎないようにする必要があるのはなぜですか?

無料ポイント

インタビュアー:Linuxを使ったことはありますか?

:はい

インタビュアー:メモリ使用量を確認したいのですが、どのようなコマンドを使用すればよいでしょうか?

freeまたはtop

インタビュアー:では、freeコマンドでどのような情報を見ることができるのか教えてください。

:下の図に示すように、メモリとキャッシュの使用状況を確認できます

  • 合計合計メモリ
  • 使用済みメモリ 使用済み
  • 空きメモリ
  • バフ/キャッシュ使用キャッシュ
  • 利用可能なメモリ

画像

インタビュアー:使用済みのキャッシュ(バフ/キャッシュ)をクリーンアップする方法をご存知ですか?

:えーっと…分からない

インタビュアー: sync; echo 3 > /proc/sys/vm/drop_caches buff/cacheをクリーンアップできます。このコマンドをオンラインで実行するのは良いことだと思いますか?

画像

: (無料ポイント、とても嬉しいです) 大きなメリットがあります。キャッシュをクリアすると、使用可能なメモリ領域が増えます。PC の xx ガードの小さなロケットのように、クリックすると大量のメモリが解放されます。

インタビュアー:えーっと…戻って通知を待ちましょう

SQL 結合

インタビュアー:話題を変えて、Join についてのあなたの理解についてお話ししましょう。

:OK(また間違えたら終わりなのでチャンスを逃さない)

レビュー

SQLのjoin特定の条件に従って指定されたテーブルを結合し、データをクライアントに返すことができます。

join方法は

inner join結合

画像

left join結合

画像

right join

画像

full join

画像

インタビュアー: プロジェクト開発でjoinステートメントを使用する必要がある場合、どのように最適化してパフォーマンスを向上させることができますか?

:小規模なデータ規模と大規模なデータ規模の 2 つの状況があります。

インタビュアー:それから?

  • データサイズは小さいので、すべてメモリに格納します。
  • データサイズが大きい

インデックスを追加することで、 joinステートメントの実行速度を最適化できます。冗長情報を使用することで、 joinの数を減らすことができます。テーブル結合の数を減らすようにしてください。1 つの SQL ステートメント内のテーブル結合の数は 5 を超えてはなりません。

インタビュアー: つまり、 joinステートメントは比較的パフォーマンスを重視すると言えますね?

:はい

インタビュアー:なぜですか?

バッファ

:結合ステートメントを実行するときは、比較プロセスが必要です。

インタビュアー:はい

: 2 つのテーブルを 1 つずつ比較するのは遅いので、2 つのテーブルからデータを 1 つずつ內存塊に読み込むことができます。MySQL の InnoDB エンジンを例にとると、次のステートメントを使用して関連するメモリ領域を確実に見つけることができます: show variables like '%buffer%'

画像

下の図に示すように、 join_buffer_sizeのサイズはjoinステートメントの実行パフォーマンスに影響します。

インタビュアー:それ以外に何かありますか?

大前提

:どんなプロジェクトでも最終的にはオンラインになり、データの生成は避けられません。そして、データの規模が小さすぎることはあり得ません。

インタビュアー:その通りです。

: データベース内のデータのほとんどは、最終的には硬盤に保存され、ファイルの形で保管されます。

MySQLのInnoDBエンジンを例に挙げる

  • InnoDBは基本的なIO単位として使用し、各ページのサイズは16KBです。
  • InnoDBはデータを格納するために各テーブルごとに.ibdファイルを作成します。

画像

確認する

画像

:これは、テーブルに接続するために必要な数のファイルを読み取る必要があることを意味します。インデックスを使用できますが、それでもハードディスクのヘッドを頻繁に移動する必要があります。

インタビュアー:つまり、頭を頻繁に動かすとパフォーマンスに影響が出るということですね?

:そうですね、 hbasekafkaなど、現在のオープンソースフレームワークは、シーケンシャルな読み書きによってパフォーマンスが大幅に向上したと言いたがりませんか?

インタビュアー: そうです。Linux Linuxこれを最適化していると思いますか? ヒント: もう一度freeコマンドを実行して確認してみてください。

: なぜキャッシュが 1.2G 以上を占有しているのですか?

画像

画像

インタビュアー:考えたことはありますか?

  • buff/cacheには何が保存されますか?
  • availlableメモリがまだ1.1Gなのに、 buff/cache大量のメモリを占有するのはなぜですか?
  • なぜbuff/cacheによって使用されたメモリを 2 つのコマンドでクリーンアップできるのに、 usedを解放できるのはプロセスを終了した場合だけなのでしょうか?

味わう、じっくり味わう

数分間考えた後

画像

buff/cacheが使用しているメモリを気軽に解放するということは、そのメモリが重要ではないということであり、それをクリアしてもシステムの動作には影響しません。

インタビュアー:必ずしもそうとは限りません。

:そうなんですか? 「CSAPP」(コンピュータシステムの詳細な理解)の一文を覚えています

メモリ階層の本質は、各ストレージ層が下位層のデバイスのキャッシュであるということです。

画像

人間の言葉に翻訳すると、 Linuxはメモリをハードディスクのキャッシュとして扱うことになる。

インタビュアー:これで、その簡単な質問に答える方法がわかりましたね?

:私は…

画像

結合アルゴリズム

インタビュアー: もう一度チャンスをください。Join アルゴリズムを実装するように頼まれたら、どうしますか?

: インデックスがない場合は、ネストされたループが役立ちます。インデックスがある場合は、それを使用してパフォーマンスを向上させることができます。

インタビュアー: join_bufferには何が格納join_bufferれていると思いますか?

:スキャンプロセス中に、データベースはテーブルを選択し、返したいデータと他のテーブルと比較したいデータjoin_bufferに格納します。

インタビュアー:インデックスがある場合はどのように対処しますか?

:これは比較的簡単です。2つのテーブルのインデックスツリーを読み取って比較するだけです。インデックスがない場合の対処方法を紹介します。

ネストループ結合

画像

ネストされたループは、毎回テーブル内の 1 行のデータのみを読み取ります。つまり、outerTable に 100,000 行のデータがあり、innerTable に 100 行のデータがある場合、 10000000回読み取る必要があります (これら 2 つのテーブルのファイルがオペレーティング システムによってメモリにキャッシュされていないと仮定すると、これらをコールド データ テーブルと呼びます)。

もちろん、現在このアルゴリズムを使用しているデータベースエンジンはありません(遅すぎるため)。

ブロックネストループ

画像

Block 、つまり、I/Oオーバーヘッドを削減するためにデータがメモリに取り込まれるたびに

MySQL InnoDB は、インデックスが利用できない場合にこのアルゴリズムを使用します。

次の2つのテーブルt_at_bを考えてみましょう。

画像

インデックスを使用して結合操作を実行できない場合、InnoDB は自動的にBlock nested loopアルゴリズムを使用します。

画像

要約する

学生時代、データベースの先生はデータベースのパラダイムについてよくテストしてくれました。働き始めて初めて、パフォーマンスがすべての基礎であるべきだということを学びました。冗長性が可能な場合はそれを使用します。それが本当に不可能で、 joinパフォーマンスに本当に影響する場合はjoinjoin_buffer_sizeを増やすか、SSD を変更してみてください。

これで、コード標準で SQL ステートメントに結合が多すぎないようにする必要がある理由に関する記事は終了です。SQL ステートメントに結合が多すぎないようにする必要がある理由の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLの結合の基本原理についての簡単な説明
  • SQL文におけるJOINの使用シナリオの分析
  • MYSQL データベースの基礎 - 結合操作の原理
  • MySQL の無効な左結合の問題を解決する方法とその使用上の注意
  • MySQLの左結合を内部結合に素早く変換するプロセス
  • MySQL の効率的なクエリの左結合とグループ化 (プラス インデックス)
  • MySQL 結合バッファの原理
  • SQLのさまざまな結合サマリーの詳細な説明

<<:  ie8/ie9/ie10/ie11 chrome firefox を区別するための CSS コード

>>:  iframeを指すaタグのターゲットの名前とIDの違い

推薦する

JavaScriptは文字の出現回数をカウントします

この記事の例では、文字の出現回数をカウントするJavaScriptの具体的なコードを参考までに共有し...

Bootstrap FileInputは画像アップロード機能を実装します

この記事の例では、Bootstrap FileInputの具体的なコードを共有して、画像アップロード...

HTML マルチメディア アプリケーション: Web ページにフラッシュ アニメーションと音楽を挿入する

1. HTML_falshアニメーションでのマルチメディアの応用(WebページへのFlashアニメー...

IE8を閲覧するときにウェブサイトが自動的にIE7互換モードを使用するようにする

序文IE の将来のすべてのバージョンで Web ページの外観が一貫していることを保証するために、IE...

Mysqlはブール型の演算を設定します

Mysqlはブール型を設定します1. Tinyintタイプテストテーブルを作成し、blフィールドをブ...

vue3 の setUp とリアクティブ関数の使用方法の詳細な説明

1. いつsetUpを実行するかvue3 ではメソッドを正常に使用できるようになったことは誰もが知っ...

VMware15 の Deepin インストール詳細チュートリアル (画像とテキスト)

序文Deepin のユーザー インターフェイスは、使用時に非常に見栄えがします。インターフェイス効果...

JavaScriptのモジュール性を理解する方法

目次1. ブラウザのサポート2.エクスポートモジュールのエクスポート3. モジュールをインポートする...

純粋な CSS でフォ​​ーム検証を実装するためのサンプル コード

日常業務において、フォームの検証は非常に一般的な設計要件です。ログイン ボックスや登録ボックス、アン...

7つのMySQL JOINタイプのまとめ

始める前に、これから紹介する JOIN タイプを示すために 2 つのテーブルを作成します。テーブルを...

HTML a タグの href 属性を使用して相対パスと絶対パスを指定する方法

実際のWeb開発では、画像の挿入やCSSファイルなどすべてパスが必要となります。ファイルパスを誤って...

jsはreduceメソッドを使用してコードをよりエレガントにします

序文実際のプロジェクトでは、最も一般的な処理は計算とループロジックである可能性があります。配列でre...

vue3.0共通コンポーネントの自動インポート方法の例

1. 前提条件インポートには require.context メソッドを使用します。vite で作成...

HTML の大なり、小なり、スペース、引用符などでよく使用されるエスケープ コードのリスト。

表は以下のとおりです。 HTMLソースコード結果を表示説明する&lt; <未満記号また...

FlashFXP FTP クライアント ソフトウェア登録クラッキング方法

FlashFXPのダウンロードアドレスは、https://www.jb51.net/softs/95...