はじめに
アプリ開発をするにあたって、DB設計をする際に今までインデックスについてあまり意識していなかったので今回の記事を通して十分に理解しDBのパーフォーマンス向上をさせていければと思います!
目次
- (前提)DBの設計を意識した方が良いことは?
- インデックスって何?
- メリット、デメリット
- 実際に使用した例
1.(前提)DBの設計を意識した方が良いことは?
・要件定義
・正規化とリレーション設計
・インデックス設計
・データ型とサイズ
・制約の設定
などになります。
今回はその中の、インデックス設計について見ていければと思います。
2. DBにおけるインデックスって何?
DBにおけるインデックスとは、データベーステーブルの特定のカラム対して作成するデータ構造のことです。
より簡単に言うと、「索引」です。
▽インデックスの役割
インデックスは本の索引のように、データがどこにあるかを高速に検索できるようにします。
SQLパフォーマンスチューニングとして使用されることが多いです。
▽インデックスがある場合とない場合
・インデックスなしでの検索:
データベースはテーブルのすべての行を順番にチェックして、条件に一致するデータを探します(フルテーブルスキャン)
・インデックスありでの検索:
インデックスを使うことで、データベースはテーブル全体をスキャンすることなく、インデックスから直接必要なデータの位置を取得できます(インデックススキャン)
3. インデックスを使用するメリットとデメリット
<メリット>
検索速度の向上
インデックスを使用することでテーブル全体を一から検索する必要がなくなります。
例えば、nameやemailで検索する場合、インデックスを利用すれば、指定したカラムのデータがすぐに見つかります。
ORDER BYやJOINが高速化
インデックスを使用することで並べ替えや結合の処理時間を短縮することができます。
例 「顧客一覧を名前順に表示したい」という場合
SELECT * FROM Customers ORDER BY name;
インデックスがない場合、通常すべての行を取り出してから名前順に並べ変える必要があり時間がかかります。
しかし、インデックスを使用している場合(基本昇順で並んでいる)、データベースはすでに並べ替えられたインデックスを使ってデータを取得できるため通常よりも早くデータを取得できます。
<デメリット>
挿入・更新・削除の低下
インデックスはデータの検索を高速化しますが、データを挿入(INSERT)、更新(UPDATE)、削除(DELETE)する際には、そのインデックスも更新しなければならないため、これらの操作の速度が遅くなることがあります。
例:新しい行をテーブルに挿入する際、インデックスもその行を追加する必要があるので、挿入処理が少し遅くなります。
過剰なインデックス作成による性能の低下
無駄なインデックスはメモリを消費し、最終的に逆効果になることもあります。
4. 実際に使用した例
基本構文
CREATE INDEX インデックス名 ON テーブル名(カラム名);
ユーザーが大量に登録されているUsersテーブルがあるとします。このテーブルにはid、name、emailなどのカラムが含まれています。
CREATE TABLE Users (
id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
このテーブルで、「特定の名前を持つユーザーをすばやく検索」する場合、nameカラムにインデックスを作成すると、検索が速くなります。
-- name カラムにインデックスを追加
CREATE INDEX idx_users_name ON Users(name);
さいごに
今回インデックスについて学ぶことで、データベース設計の中で意識すべきポイントがかなり見えてきました。特に、検索や並べ替えの速度向上に役立つインデックスは、アプリのパフォーマンス改善に直結するんだなと感じました。ただし、挿入・更新の際に影響が出ることや、むやみにインデックスを増やすと逆効果になるリスクもあるので、ここは慎重に考える必要がありそうです。
これからの開発では、今回学んだインデックスの知識を活かして、必要な部分にだけうまくインデックスを配置することで、より効率的で快適なアプリケーションを作れるよう頑張っていこうと思いました!