MySQLにインデックスを追加する方法

MySQLにインデックスを追加する方法

インデックスの簡単な紹介は次のとおりです。

インデックスを追加する目的は、データベース クエリのパフォーマンスを向上させることです。インデックスは最もコスト効率の高いものです。メモリを追加したり、プログラムを変更したり、SQL を調整したりする必要はありません。正しいインデックス作成を実行するだけで、クエリ速度が数百倍または数千倍に向上する可能性があります。これは魅力的ですが、無料のランチはありません。クエリ速度の向上は、挿入、更新、および削除の速度を犠牲にして実現されます。また、インデックスのサイズは一般的にデータの 3 分の 1 です。また、インデックスはメモリにロードする必要があります。すべてのフィールドにインデックスを付けるとメモリを犠牲にしてしまうため、適切にインデックスを追加する必要があります。

ここでは、MySQL でよく使用されるインデックスについて簡単に紹介します。

インデックスを追加する前に、テーブルに既に存在するインデックスを確認することをお勧めします: show index from table name;

1. 主キーインデックス

注: テーブルには主キー インデックスを 1 つしか作成できませんが、一意のインデックス、通常のインデックス、フルテキスト インデックスなど、複数のインデックスを追加できます。

主キー インデックス: 通常、テーブルの作成時に追加されます。たとえば、id は通常、主キー インデックスに自動増分を加えたものです。

alter table table_name add primary key (column name);

主キー インデックスの特性: 空および一意にすることはできません。

2. 普通指数

通常のインデックスを作成します: alter table table_name add index 索引名(column1,column2);

3. ユニークインデックス

一意のインデックスを作成します: ALTER TABLE `table_name` ADD UNIQUE (`column`);

ユニーク インデックスと主キー インデックスの違い:

一意のインデックス: 複数の null を持つことができますが、データの内容は繰り返すことができません。

主キー インデックス: null にすることはできず、コンテンツは一意である必要があります。

2 つの違いは、主キー インデックスは null にできないのに対し、一意のインデックスは複数の null を持つことができることです。残りは同じです。

4. 全文インデックス

全文インデックスはMyISAMでのみ利用可能です(InnoDBもMySQL 5.6以降では全文インデックスをサポートしています)[5.7はMyISAMをサポートしていません]

全文インデックスは、主に記事やタイトルなどのテキスト ファイルを対象としています。

テーブルを作成するときにフルテキスト インデックスを作成します。

    テーブル「記事」を作成します(
    `id` int(10) 符号なし NOT NULL AUTO_INCREMENT,
     `title` varchar(200) デフォルト NULL,
 `コンテンツ`テキスト、
      主キー (`id`)、
      フルテキストキー `title` (`title`,`content`)
      ) ENGINE=MyISAM (InnoDB は 5.6 以降ではフルテキスト インデックスもサポートしていますが、5.7 では MyISAM エンジンはサポートされていません) DEFAULT CHARSET=utf8;

既存のテーブルにフルテキスト インデックスを作成するには:

ALTER TABLE article に FULLTEXT INDEX fulltext_article(title,content); を追加します。

フルテキスト インデックスを作成した後で使用する際に注意すべき点もいくつかあります。

データベース内のあいまいクエリは like キーワードを使用して実行されることはよく知られています。次に例を示します。

SELECT * FROM article WHERE content LIKE '%query string%';

では、フルテキストインデックスも同じように使用するのでしょうか?もちろん違います。フルテキスト インデックスを使用してクエリを実行するには、特別な構文を使用する必要があります。たとえば、article テーブルの title 列と content 列で指定されたクエリ文字列の全文を検索する場合、SQL ステートメントを次のように記述できます。

SELECT * FROM article WHERE MATCH(title,content) AGAINST ('クエリ文字列');

強く注意してください: MySQL の組み込みフルテキスト インデックスは英語のテキストに対してのみフルテキスト検索を実行でき、現在のところ中国語のテキストに対してフルテキスト検索を実行できません。中国語を含むテキスト データの全文検索を実行する必要がある場合は、中国語を処理するために Sphinx/Coreseek テクノロジを使用する必要があります。

注意: 現在、MySQL が提供するフルテキスト インデックスを使用する場合、クエリ文字列が短すぎると、期待どおりの検索結果が得られません。 MySql フルテキスト インデックスで見つかる単語のデフォルトの最小長は 4 文字です。さらに、クエリ文字列にストップワードが含まれている場合、ストップワードは無視されます。

可能であれば、テーブルの作成時にフルテキスト インデックスを直接作成するのではなく、フルテキスト インデックスを作成する前にテーブルを作成してすべてのデータを挿入するようにしてください。前者の方が後者よりも効率的です。

インデックスを削除する SQL ステートメント: alter table table_name drop index 索引名;

上記の簡単な紹介の後、どのフィールドをインデックス化する必要がありますか?

1. 頻繁にクエリされるフィールドにインデックスを作成する必要があります。

2. 頻繁に更新されるフィールドにはインデックスを作成しないでください。

3. 性別フィールドなど、一意性が低いフィールドはインデックス化しないでください。

4. where 条件の後に表示されないフィールドにはインデックスを付けないでください。

次の条件が満たされる場合は、インデックスを作成する必要があります。

1. where 条件の後に頻繁に表示される、頻繁にクエリされるフィールドには、インデックスを作成する必要があります。

2. 頻繁に更新されないフィールドには、インデックスを作成できます。

インデックスの使用に関する注意事項

1. 作成された複数列インデックスの場合、クエリ条件が左端の列を使用している限り、通常、インデックスが使用されます。

  • たとえば、タイトルとコンテンツに複合インデックスを追加しました
  • select * from table_name where title = 'test'; インデックスが使用されます
  • select * from table_name where content = 'test'; インデックスは使用されません

2. LIKE を使用するクエリでは、クエリが '%a' の場合、インデックスは使用されませんが、like 'a%' の場合はインデックスが使用されます。先頭に%や_などの変数値を使用することはできません

3. 条件に or がある場合、条件にインデックスがあっても使用されません。

4. 列の型が文字列の場合は、条件内のデータを必ず引用符で囲んでください。

  • インデックスの使用状況を確認します: show status like'Handler_read%';
  • handler_read_key: 値が高いほど良いです。値が高いほど、インデックスがクエリに使用される回数が多くなります。
  • handler_read_rnd_next: この値が高いほど、クエリの効率は低くなります。

要約する

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

以下もご興味があるかもしれません:
  • MySQLテーブルにタイムスタンプを追加するいくつかの方法
  • MYSQLは、ショッピングカートに追加する際に重複追加を防ぐためのサンプルコードを実装します。
  • MySQL でストアド プロシージャを作成し、ループでレコードを追加する方法
  • テーブルの作成、フィールドの追加、フィールドの変更、インデックスの追加によく使用される MySQL の SQL 文の概要
  • SQL でテーブルにフィールドとコメントを追加する方法

<<:  Vue3.xはコンポーネント通信にmitt.jsを使用します

>>:  Linux自動ログイン例の説明

推薦する

MySQLでユーザー認証情報を表示する具体的な方法

具体的な方法: 1. コマンドプロンプトを開く2. mysql -u root -pコマンドを入力し...

JS でパブリッシュ サブスクライブ モデルを作成する

目次1. シーン紹介2 コードの最適化2.1 ファンを増やす問題を解決する2.2 作品追加の問題を解...

MySQL ロックブロッキングの詳細な分析

日常のメンテナンスでは、スレッドがブロックされることが多く、データベースの応答が非常に遅くなります。...

JavaScriptの動作メカニズムの詳細な説明とイベントループについての簡単な説明

目次1. JavaScript がシングルスレッドなのはなぜですか? 2. タスクキュー3. イベン...

JavaScriptオブジェクトをマージするさまざまな方法の詳細な説明

目次オブジェクトをマージするさまざまな方法(インターフェースを通じてデータを取得し、それをローカル ...

Reactはtodolistの追加、削除、変更、クエリを実装します

目次ToDoリストを例に挙げましょうディレクトリは次のとおりですアプリ入力.jsリスト.jsアイテム...

MySQLで日付を比較する方法の詳細な説明

データ型が datetime であるフィールド add_time を持つテーブル product が...

Unix/Linuxフォークの隠れたオーバーヘッド

目次1. フォークの起源2. 初期のUNIXオーバーレイ技術3. UNIXに導入される前のフォークの...

Reactでのこのリファレンスの詳細な説明

目次原因:以下を実行します: 1. コンストラクター2.レンダリング機能3.bind関数とarrow...

CSS の position 属性の値に関する研究 (概要)

CSS の位​​置属性は要素の配置タイプを指定し、上、下、左、右を使用して要素を具体的に配置します...

JavaScriptページングコンポーネントの使い方の詳細な説明

ページネーションコンポーネントはWeb開発でよく使われるコンポーネントです。ページネーション機能を実...

HTML、CSS、RSSフィードが正しいかどうかを確認する無料ツール

この種のエラーに対処するための 1 つの方法は、まずマークアップとスタイルシートを検証することです。...

MySQL パーティションテーブルの制限と制約の詳細な説明

ビルドを無効にするパーティション式では、次の構成はサポートされません。ストアドプロシージャ、ストアド...

Nginx のリロード プロセスの背後にある真実を探る

本日の記事では、主にNginxのリロードプロセスについて紹介します。実は前回の記事では、nginx ...

IntelliJ IDEA に Docker プラグインをインストールする詳細な手順 (2018 バージョン)

目次1. 開発環境2. dockerプラグインをインストールする1. アイデアのインストール2. イ...