MySQLインデックスを正しく作成する方法

MySQLインデックスを正しく作成する方法

インデックス作成は大学図書館の書誌インデックスの構築に似ており、データ検索の効率を向上させ、データベースの IO コストを削減できます。 MySQL のパフォーマンスは、公式ドキュメントでは 500 万~800 万レコードと記載されていますが、約 300 万レコードを超えると低下し始めるため、大量のデータに対してインデックスを作成することが非常に重要です。 MySQL は、SQL 実行に関する詳細情報を表示し、インデックスを最適化するために使用される Explain を提供します。

インデックスとは何ですか?

MySQL のインデックスの公式定義は次のとおりです: インデックスは、MySQL がデータを効率的に取得するのに役立つデータ構造です。簡単に言えば、ソートされた順序を素早く見つけるデータ構造です。 MySQL インデックスには、B+ ツリー インデックスとハッシュ インデックスという 2 つの主な構造があります。インデックスについて話すときは、特に指定がない限り、通常は B ツリー構造 (B+ ツリー インデックス) で編成されたインデックスを指します。インデックスは図に示されています:

最も外側の水色のディスク ブロック 1 には、データ 17、35 (濃い青) とポインター P1、P2、P3 (黄色) が含まれています。 P1 ポインタは 17 より小さいディスク ブロックを示し、P2 は 17 から 35 の間であり、P3 は 35 より大きいディスク ブロックを指します。実際のデータは、最下層の 3、5、9、10、13 などのサブリーフ ノードに存在します。非リーフ ノードには実際のデータは保存されず、17、35 など、検索方向を導くデータ項目のみが格納されます。

検索プロセス: たとえば、データ項目 28 を検索するには、まずディスク ブロック 1 をメモリにロードし、I/O を発生させ、バイナリ検索を使用して P2 ポインターを決定します。次に、28 が 26 と 30 の間にあることがわかり、ディスク ブロック 3 が P2 ポインタのアドレスを通じてメモリにロードされ、2 番目の I/O が発生します。ディスク ブロック 8 も同様に見つかり、3 番目の I/O が発生します。

実際には、B+ ツリーの上位 3 層は数百万のデータを表すことができます。数百万のデータには、数百万の I/O 操作ではなく 3 つの I/O 操作のみが必要であり、時間の改善は大幅に改善されます。

データ テーブル インデックスを使用すると、データ取得の効率が向上し、データベース IO コストが削減されます。また、インデックスを使用すると、データベースのソート コストも削減されます。ソートおよびグループ化操作は主に CPU リソースとメモリを消費するため、ソートおよびグループ化操作でインデックスを有効活用できれば、CPU リソースの消費を大幅に削減できます。以下では、MySQL データ インデックスを正しく作成する方法を簡単に分析します。

インデックスを作成する必要があるかどうかを判断するにはどうすればよいでしょうか?

1. クエリ条件として頻繁に使用する必要があるフィールドがある場合は、それらのフィールドのインデックスを作成する必要があります。

誰もがこれを知っているはずですが、何が頻繁であると考えられるのでしょうか?実行するすべての SQL ステートメントを包括的に分析します。すべてを一つずつリストアップするのが最善でしょう。その後、分析の結果、一部のフィールドがほとんどの SQL クエリ ステートメントで使用されていることがわかったので、それらのフィールドに対してインデックスを作成することに決めました。

2. 一意性が低いフィールドはインデックス作成に適さない

十分に一意ではないフィールドは何ですか?ステータス フィールドやタイプ フィールドなど。ユーザーのログイン ステータス、メッセージのステータスなど、いくつかの固定値のみを保存するフィールド。これには、インデックススキャンの特性が関係します。たとえば、インデックスを通じてキー値 A と B を持つデータを検索し、ページ X にある A を通じて一致するデータを見つけ、スキャンを続行してページ Y で A に一致するデータを見つけた場合、ストレージ エンジンはページ X のデータを破棄し、A に一致するすべてのデータが見つかるまでページ Y にデータを格納します。次に、フィールド B を検索し、ページ X でフィールド B に一致するデータを見つけた場合、ストレージ エンジンはページ X を再度スキャンします。つまり、ページ X は 2 回以上スキャンされることになります。同様に、同じデータ ページが繰り返し読み取られ、破棄され、再度読み取られる可能性があり、これによりストレージ エンジンの IO 負荷が大幅に増加するのは間違いありません。

3. 頻繁に更新されるフィールドはインデックス作成には適していません

フィールドにインデックスを作成すると、フィールドのデータを再度更新すると、データベースは自動的にインデックスを更新します。そのため、フィールドが頻繁に更新されると、インデックスが常に更新され、パフォーマンスへの影響が予想されます。何十回も検索された後に一度だけ更新されるフィールドは、インデックス作成に適しています。フィールドが同じ期間内に複数回更新された場合、インデックスを作成することはできません。

4. where条件に含まれないフィールドはインデックス化しない

これについては、実際には特に言うことはありません。クエリ条件として使用されないフィールドにインデックスを作成しても意味がありません。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • MySQL インデックスの長所と短所、およびインデックス作成のガイドライン
  • MySQL 文字列インデックスのより合理的な作成ルールに関する議論
  • MySQL コマンドを使用してインデックスを作成、削除、およびクエリする方法の紹介
  • MySQL の結合テーブルにインデックスを作成する方法
  • MySQLが全文インデックス共有を実現
  • MySQL インデックスの概要の詳細な説明 - MySQL インデックスの種類と作成
  • MySQL でインデックスを表示、作成、削除する方法
  • mysql インデックスの追加 mysql インデックスの作成方法
  • MySQLインデックスの作成について知っておくべきこと

<<:  JavaScript でシンプルなタイマーを実装する

>>:  ApplicationHost.config (IIS ストレージ構成領域ファイル) の概要

推薦する

Hyper-V の紹介とインストールと使用 (詳細な図解)

はじめに:IT 業界の巨人である Microsoft 独自の仮想化技術は、VMware や Citr...

Linuxの簡単な分析でファイアウォールの状態と外部に開いているポートの状態を確認する

1. ファイアウォールの状態を確認するファイアウォールのステータスを確認する systemctl s...

SQLで同じフィールドの異なる値のデータ統計を実行する

適用シナリオ: シールのさまざまな状態に応じて、さまざまな状態のシールの数をカウントする必要がありま...

MySQL が「operate_time」エラーのデフォルト値が無効であると報告する問題を解決する

データベースでcreate tableステートメントを実行する テーブル `sys_acl` を作成...

iframe を使用して Web ページに天気の影響を表示します

CS: ...コードをコピーコードは次のとおりです。 *{マージン:0;パディング:0;リストスタイ...

nginx で gzip 圧縮を実装してウェブサイトの速度を向上させる方法

目次gzip 圧縮を使用する理由は何ですか? nginxはgzipを実装するgzip処理nginx ...

Dockerのデフォルトネットワークセグメントの正しい変更手順

背景同僚がセキュリティ プロジェクトに取り組んでおり、AWS サーバーに秘密兵器を展開する必要があり...

Node.js でのブレークポイント再開の実装

序文通常のビジネスニーズ: 写真、Excel などをアップロードします。結局のところ、数 MB のサ...

blockquote タグの使用に関する注意

<br />セマンティクス化は一言で説明することはできないし、まだ公式かつ厳密な定義もあ...

MySQL で lower_case_table_names を記録する際の落とし穴の詳細な説明

1 原因プロジェクトがデータベースを移行して再起動した後、「T_AAAテーブルが存在しません」という...

データベースの水平セグメンテーションを実装するための2つのアイデア

導入インターネット アプリケーションの普及に伴い、膨大なデータの保存とアクセスがシステム設計における...

Vue.js プロジェクトの開始方法

目次1. Node.jsとVue 2. ローカル開発環境でフロントエンドのVueプロジェクトを実行す...

Vue における Vue.use() の原理と基本的な使用法

目次序文1. 例で理解する2. ソースコードを分析する3. まとめ要約する序文他の人のコンポーネント...

Net Core実装プロセス分析のDoc​​kerインストールと展開

1. Dockerのインストールと設定 #CentOS をインストールし、Docker パッケージを...

IE7 互換モードで IE8 を有効にするコード

最も人気のあるタグはIE8ですブラウザベンダーはバージョンアップデートのリリースに躍起になっている一...