コード標準では、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の違い

推薦する

Tomcat および Web アプリケーションの Docker デプロイメントの実装

1.dockerをオンラインでダウンロードする yum インストール -y epel-release...

MySQL で GTID モードをオンラインで有効または無効にする

目次基本的な概要GTIDをオンラインで有効にする1. GTID検証ENFORCE_GTID_CONS...

Linux システムに Zookeeper サービスをインストールする方法

1. /usr/local/services/zookeeper フォルダを作成します。 mkdir...

Linux デュアル ネットワーク カード バインディング スクリプト メソッドの例

Linux の操作と構成作業では、デュアル ネットワーク カードのバインディングがよく使用されます。...

Dockerでローカルマシン(ホストマシン)にアクセスする方法

質問Docker でローカル データベースにアクセスするにはどうすればよいでしょうか? 127.0....

ウェブサイトをより高く、よりデザイン的に見せる方法

「ウェブサイトを高級感のあるものにするにはどうすればいいでしょうか? それともデザイン重視にすればい...

Windows で複数の MySQL インスタンスを実行する方法

序文Windows では、各インスタンスに適切なパラメータを使用してコマンド ラインから複数の My...

MySQL の完全バックアップ中に特定のライブラリを除外する方法

MySQLの完全バックアップを実行するときは、--all-databaseパラメータを使用します。例...

React Nativeの起動プロセスの詳細分析

はじめに: この記事ではreact-native-cliで作成したサンプル プロジェクト (Andr...

Nginx の負荷分散アルゴリズムとフェイルオーバー分析

概要Nginx ロード バランシングは、アップストリーム サーバー (実際のビジネス ロジックによっ...

Linuxでディレクトリを効率的に切り替える方法

Linux でディレクトリを切り替えるとなると、誰もが間違いなくcdコマンドを思い浮かべるでしょう。...

JavaScript ベースのパスワード ボックス検証情報の実装

この記事では、パスワードボックスの検証情報を実装するためのJavaScriptの具体的なコードを例と...

MySQL 8.0 のインデックス スキップ スキャン

序文MySQL 8.0.13 では、インデックス スキップ スキャン (インデックス ジャンプ スキ...

MySQLループは数千万のデータを挿入する

1. テストテーブルを作成する テーブル `mysql_genarate` を作成します ( `id...

MLSQLコンパイル時権限制御例の詳細な説明

序文MySQL の権限を簡単に理解すると、MySQL では自分の能力の範囲内で操作が許可され、その限...