English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MySQL インデックス

MySQLのインデックスの作成は、MySQLの効率的な動作において非常に重要であり、インデックスはMySQLの検索速度を大幅に向上させます。

例えば、インデックスの設計と使用が合理的であれば、インデックスを使用するMySQLはランボルギーニであり、インデックスの設計や使用がなされていないMySQLは人力三輪車に相当します。

中国語の辞書の目次ページ(インデックス)を例に取ると、発音、筆画、部首などで並べ替えられた目次(インデックス)を利用して、必要な字を素早く見つけることができます。

インデックスは単列インデックスと組み合わせインデックスに分類されます。単列インデックスは、インデックスが1つの列だけを含むインデックスであり、テーブルには複数の単列インデックスが存在できますが、これは組み合わせインデックスではありません。組み合わせインデックスは、インデックスが複数の列を含むインデックスです。

インデックスを作成する際には、そのインデックスがSQLクエリ文の条件(一般的にはWHERE子句の条件)に適用されていることを確認する必要があります。

実際には、インデックスもテーブルであり、主キーとインデックスフィールドを保存し、実体テーブルのレコードを指すものです。

上記はインデックスの利点について述べていますが、インデックスの過度な使用は悪用となります。したがって、インデックスにも欠点があります:インデックスは検索速度を大幅に向上させますが、一方でテーブルの更新速度を低下させます。INSERT、UPDATE、DELETEなどのテーブルの更新時、MySQLはデータだけでなくインデックスファイルも保存する必要があります。

インデックスの作成はディスクスペースを消費するインデックスファイルを占有します。

通常のインデックス

インデックスの作成

これは最も基本的なインデックスであり、制限はありません。以下のような作成方法があります:

CREATE INDEX indexName ON table_name (column_name)

CHAR、VARCHARタイプの場合、lengthは実際のフィールド長さより小さい場合でもできます;BLOBやTEXTタイプの場合、lengthを指定する必要があります。

テーブル構造の変更(インデックスの追加)

ALTER table tableName ADD INDEX indexName(columnName)

テーブルを作成する際に直接指定

CREATE TABLE mytable(  
 
ID INT NOT NULL,   
 
username VARCHAR(16) NOT NULL,  
 
INDEX [indexName] (username(length))  
 
);

インデックスの削除の構文

DROP INDEX [indexName] ON mytable;

ユニークインデックス

これは前の通常のインデックスと似ていますが、異なる点は:インデックス列の値がユニークでなければなりませんが、空値を許可しています。組み合わせインデックスの場合、列値の組み合わせがユニークでなければなりません。以下の方法で作成できます:

インデックスの作成

CREATE UNIQUE INDEX indexName ON mytable(username(length))

テーブル構造の変更

ALTER table mytable ADD UNIQUE [indexName] (username(length))

テーブルを作成する際に直接指定

CREATE TABLE mytable(  
 
ID INT NOT NULL,   
 
username VARCHAR(16) NOT NULL,  
 
UNIQUE [indexName] (username(length))  
 
);

ALTERコマンドを使用してインデックスを追加および削除

データテーブルのインデックスを追加する方法は4種類あります:

  • ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): この文は、主キーを追加しており、インデックスの値がユニークで且つNULLでないことが意味されます。

  • ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): この文は、インデックスの値がユニークでなければなりません(NULLは複数回出現することがありますが、NULLを除く)。

  • ALTER TABLE tbl_name ADD INDEX index_name (column_list): 通常のインデックスを追加し、インデックス値は複数回出現できます。

  • ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):この文は、インデックスをFULLTEXTに指定しており、全文インデックス用です。

以下の例は、テーブルにインデックスを追加するためのものです。

mysql> ALTER TABLE testalter_tbl ADD INDEX (c);

ALTERコマンドでDROP子句を使用してインデックスを削除できます。以下の例を使用してインデックスの削除を試みてください:

mysql> ALTER TABLE testalter_tbl DROP INDEX c;

ALTER コマンドを使用してプライマリキーの追加と削除

プライマリキーは列上に作用します(一つの列または複数の列の組み合わせで主キーとして使用できます)。プライマリキーインデックスを追加する際には、そのプライマリキーがデフォルトで NULL でないことを確認する必要があります。以下に例を示します:

mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);

また、ALTER コマンドを使用してプライマリキーを削除することもできます:

mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;

プライマリキーを削除する場合は、ただ PRIMARY KEY を指定するだけで良いですが、インデックスを削除する場合は、インデックス名を知っている必要があります。

インデックス情報の表示

SHOW INDEX コマンドを使用して、テーブルに関連するインデックス情報をリストアップできます。\Gを追加することで、情報のフォーマット化された出力を得ることができます。

以下の例を試してみてください:

mysql> SHOW INDEX FROM table_name; \G
........