インデックスの作成とは、テーブルの 1 つ以上の列にインデックスを作成することを指し、テーブルのアクセス速度を向上させることができます。インデックスの作成は、MySQL データベースの効率的な運用にとって非常に重要です。
基本文法
MySQL には、インデックスを作成する 3 つの方法が用意されています。
1) CREATE INDEX ステートメントを使用する
インデックスを作成するように設計された CREATE INDEX ステートメントを使用して、既存のテーブルにインデックスを作成できますが、このステートメントでは主キーを作成できません。
文法形式:
CREATE <インデックス名> ON <テーブル名> (<カラム名> [<長さ>] [ASC | DESC])
構文は次のように説明されています。
<索引名>
:インデックス名を指定します。テーブルは複数のインデックスを作成できますが、テーブル内の各インデックスの名前は一意です。<表名>
処置:索引を作成する表名を指定してください。<列名>
:索引付けする列の名前を指定します。通常、クエリ文の JOIN 句や WHERE 句に頻繁に現れる列をインデックス列と見なすことができます。<长度>
:オプション。列の前にある長さ文字を使用して索引を作成することを指定します。列の一部を使用してインデックスを作成すると、インデックス ファイルのサイズを縮小し、インデックス列が占めるスペースを節約するのに役立ちます。場合によっては、列のプレフィックスのみをインデックス化できます。インデックス列の長さの最大上限は 255 バイトです (MyISAM および InnoDB テーブルの最大上限は 1000 バイトです). インデックス列の長さがこの上限を超える場合は、列のプレフィックスのみを使用できます索引付け用。さらに、BLOB または TEXT 型の列は、プレフィックス インデックスも使用する必要があります。ASC|DESC
:オプション。ASC
指定されたインデックスは昇順でソートされ、DESC
指定されたインデックスは降順でソートされます。デフォルトは ですASC
。
2) CREATE TABLE ステートメントを使用する
テーブルの作成中にインデックスを作成することもできます (CREATE TABLE)。次のステートメントを CREATE TABLE ステートメント内に追加します。文法形式:
CONSTRAINT PRIMARY KEY [インデックスの種類] (<カラム名>,…)
このステートメントを CREATE TABLE ステートメントに追加すると、新しいテーブルの作成中にテーブルの主キーが作成されます。
文法形式:
KEY | INDEX [<インデックス名>] [<インデックスの種類>] (<カラム名>,…)
このステートメントを CREATE TABLE ステートメントに追加すると、新しいテーブルの作成中にテーブルのインデックスが作成されることを意味します。
文法形式:
UNIQUE [ INDEX | KEY] [<インデックス名>] [<インデックス タイプ>] (<カラム名>,…)
このステートメントを CREATE TABLE ステートメントに追加するということは、新しいテーブルの作成中にテーブルの一意のインデックスを作成することを意味します。
文法形式:
FOREIGN KEY <インデックス名> <カラム名>
このステートメントを CREATE TABLE ステートメントに追加すると、新しいテーブルが作成されると同時に、テーブルの外部キーが作成されます。
CREATE TABLE ステートメントを使用して列オプションを定義する場合、列定義の直後に PRIMARY KEY を追加して主キーを作成できます。主キーが複数のカラムからなるマルチカラムインデクスの場合、この方法は使えず、文末にPRIMARY KRY(<カラム名>,...)句を追加することでしか実現できません。
3) ALTER TABLE ステートメントを使用する
CREATE INDEX ステートメントは既存のテーブルにインデックスを作成でき、ALTER TABLE ステートメントも既存のテーブルにインデックスを作成できます。ALTER TABLE ステートメントを使用してテーブルを変更する際に、既存のテーブルにインデックスを追加できます。具体的な方法は、次の文法コンポーネントを 1 つ以上 ALTER TABLE ステートメントに追加することです。
文法形式:
ADD INDEX [<インデックス名>] [<インデックスの種類>] (<カラム名>,…)
この文法コンポーネントを ALTER TABLE ステートメントに追加することは、テーブルの変更中にテーブルにインデックスを追加することを意味します。
文法形式:
ADD PRIMARY KEY [<インデックスの種類>] (<列名>,…)
この文法コンポーネントを ALTER TABLE ステートメントに追加するということは、テーブルの変更中に主キーをテーブルに追加することを意味します。
文法形式:
ADD UNIQUE [ INDEX | KEY] [<インデックス名>] [<インデックス タイプ>] (<カラム名>,…)
この文法コンポーネントを ALTER TABLE ステートメントに追加するということは、テーブルの変更中に一意のインデックスをテーブルに追加することを意味します。
文法形式:
ADD FOREIGN KEY [<インデックス名>] (<列名>,…)
この文法コンポーネントを ALTER TABLE ステートメントに追加することは、テーブルの変更中にテーブルに外部キーを追加することを意味します。
通常のインデックスを作成する
通常のインデックスを作成する場合、通常は INDEX キーワードが使用されます。
例 1
テーブル tb_stu_info を作成し、テーブルの高さフィールドに通常のインデックスを作成します。入力したSQL文と実行処理は以下のとおりです。
mysql> CREATE TABLE tb_stu_info
-> (
-> id INT NOT NULL,
-> name CHAR(45) DEFAULT NULL,
-> dept_id INT DEFAULT NULL,
-> age INT DEFAULT NULL,
-> height INT DEFAULT NULL,
-> INDEX(height)
-> );
Query OK,0 rows affected (0.40 sec)
mysql> SHOW CREATE TABLE tb_stu_info\G
*************************** 1. row ***************************
Table: tb_stu_info
Create Table: CREATE TABLE `tb_stu_info` (
`id` int(11) NOT NULL,
`name` char(45) DEFAULT NULL,
`dept_id` int(11) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`height` int(11) DEFAULT NULL,
KEY `height` (`height`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312
1 row in set (0.01 sec)
ユニークなインデックスを作成する
通常は UNIQUE パラメータを使用して、一意のインデックスを作成します。
例 2
テーブル tb_stu_info2 を作成し、UNIQUE キーワードを使用してテーブルの id フィールドに一意のインデックスを作成します。入力したSQL文と実行処理は以下のとおりです。
mysql> CREATE TABLE tb_stu_info2
-> (
-> id INT NOT NULL,
-> name CHAR(45) DEFAULT NULL,
-> dept_id INT DEFAULT NULL,
-> age INT DEFAULT NULL,
-> height INT DEFAULT NULL,
-> UNIQUE INDEX(height)
-> );
Query OK,0 rows affected (0.40 sec)
mysql> SHOW CREATE TABLE tb_stu_info2\G
*************************** 1. row ***************************
Table: tb_stu_info2
Create Table: CREATE TABLE `tb_stu_info2` (
`id` int(11) NOT NULL,
`name` char(45) DEFAULT NULL,
`dept_id` int(11) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`height` int(11) DEFAULT NULL,
UNIQUE KEY `height` (`height`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312
1 row in set (0.00 sec)
ダーク ホース プログラマー MySQL データベース エントリから習熟まで、mysql のインストールから高度な mysql まで、mysql の最適化をすべて網羅