前回記事:MySQLのバックアップに「mysqldump」のコマンドと主要オプションでは、mysqldumpを使ったデータベースのバックアップ&リストア方法と、主要なオプションについてご紹介しました。今回は、MySQLでINDEX(インデックス)を追加・確認・削除する方法をご紹介したいと思います。
目次
1.1 インデックスとは
1.2 インデックスを貼るメリット
1.3 インデックスを貼るデメリット
1.4 インデックスを貼る対象を探す「EXPLAIN」
2.1 現在のインデックスを確認する「SHOW INDEX」
2.2 実行例と実行結果
3.1 インデックスを追加する「ADD INDEX」
3.2 実行例と実行結果
3.3 複合インデックスを追加する場合
3.4 実行例と実行結果
1.インデックス(INDEX)とは?
1.1 インデックスとは
インデックスとは、データベース内から特定のデータを検索しやすくするための仕組みです。
インデックスにはいくつか方式がありますが、MySQLで使われているのはB-Treeという方式です。B-Treeの仕組みをざっくりと説明すると、インデックスを貼られたカラムは検索しやすいようツリー構造に加工され、テーブル本体とは別の場所に保存されます。検索する際にはその加工したデータの方を見に行くことで、高速化を図っているのです。
1.2 インデックスを貼るメリット
インデックスを貼るメリットは、先ほど述べたとおり検索の高速化です。適切なカラムにインデックスを貼っておくことにより、インデックスなしの状態よりかなり高速化することができる場合があります。ただしインデックスを貼る対象はなんでもいいというものではなく、どんなSQL文を多用する予定であるかを考え、実行計画を確認しながらきちんと検討する必要があります。
1.3 インデックスを貼るデメリット
インデックスは、前述のとおりテーブル本体とは別の領域に保存されています。つまりインデックスをつけることで、データの保存に必要な領域が増えることになります。
また、新しくデータを追加した際やデータを更新した際には、インデックスも追加・更新する処理が行われることになります。そのため検索系のSQLは高速化できますが、レコードの追加・更新については少し遅くなるというデメリットがあります。
1.4 インデックスを貼る対象を探す「EXPLAIN」
「EXPLAIN」は、実行計画を取得するコマンドです。実行計画を調べたいSQL文の先頭に追加するだけで使用できます。
EXPLAIN [実行したいSQL文];
「possible_key」には、そのSQLを実行する際に有効なインデックスを貼る候補に挙がっているカラム名が表示されます。「key」には、現在インデックスが貼られているカラム名が表示されます。今回実行したデータベースはごく単純でレコードも少ないため、「possible_keys」はNULLとなっています。
2.インデックスの参照
2.1 現在のインデックスを確認する「SHOW INDEX」
すでに貼られているインデックスを確認するには、SHOW INDEX文を使います。
SHOW TABLES FROM [データベース名];
2.2 実行例と実行結果
データベース名「db_01」にある「USER_DATA」というテーブルに対して、インデックスの参照を実行してみます。
このテーブルにはまだインデックスは設定されていないため、図のように「PRIMARY(主キー)」のみが表示されました。
3.インデックスの追加
3.1 インデックスを追加する「ADD INDEX」
インデックスを追加するには、ALTER TABLE文の「ADD INDEX」を使用します。
基本の書式は、次の通りです。
ALTER TABLE [テーブル名] ADD INDEX [インデックス名]([カラム名]);
3.2 実行例と実行結果
先ほどのテーブル「USER_DATA」のカラム「USER_ID」に、インデックスを追加します。
ALTER TABLE db_01.USER_DATA ADD INDEX index01(user_id);
実行後にインデックスを参照すると、「PRIMARY」の下に「index01」が追加されていました。
3.3 複合インデックスを追加する場合
複合インデックスを追加したい場合、対象となるカラム名をカンマで区切って並べるだけでOKです。
ALTER TABLE [テーブル名] ADD INDEX [インデックス名]([カラム名1, カラム名2,...]);
3.4 実行例と実行結果
同様に、テーブル「USER_DATA」のカラム「USER_ID」と「USER_NAME」の2つに、複合インデックスを追加します。
ALTER TABLE db_01.USER_DATA ADD INDEX index02(user_id, user_name);
インデックスの参照を実行すると、カラム名「USER_ID」と「USER_NAME」として、「index02」が合計2行追加されました。
4.インデックスの削除
4.1 インデックスを削除する「DROP INDEX」
インデックスを削除する場合は、ALTER TABLE文の「DROP INDEX」を使用します。
ALTER TABLE [テーブル名] DROP INDEX [インデックス名];
4.2 実行例と実行結果
前項で作成した「index01」を削除するコマンドは、次のようになります。
ALTER TABLE db_01.USER_DATA DROP INDEX index01;
このように「index01」は削除され、「index02」のみが残りました。
5.まとめ
インデックスはSQLチューニングの第一歩ですが、実行計画を使いこなすのはなかなか難しいかと思います。その場合はSQLを実行した際に表示される「検索に要した時間」をチェックしながらインデックスを貼ったり消したりしてみるのが単純ですが一番簡単な方法かと思いますので、試してみて下さい。
次回はMySQLで使用できる文字列結合の方法についてご紹介したいと思います。
よければ合わせてご覧下さい。
関連記事:
無料でも使える高機能データベース「MySQL」とは
関連記事:
MySQLのダウンロード&インストールと初期設定方法
関連記事:
MySQLのデータベースに接続する3つの方法と接続手順
関連記事:
便利な公式ツールMySQL Workbenchの使い方と日本語化方法
関連記事:
MySQLでユーザを作成し、権限を設定する方法
関連記事:
MySQLで新規にデータベースを作成・削除する方法
関連記事:
MySQLでテーブルを作成・削除・変更する方法