インデックスを使用し、クエリの処理速度を向上させる

インデックスの概要について

こんにちは、技術部のMです。
今回は、SQLの処理速度を向上させる手段の一つであるインデックスついて自分なりに解説してみたいと思います。



インデックスとは

インデックスは、データベースのテーブルに対して特定の列に基づいて作成されるデータ構造で、検索を高速化するために使用されます。
インデックスは、本の索引のように、特定のデータの場所を迅速に見つけることを可能にします。



インデックスを使用して処理速度が向上する理由

インデックスを使用すると、データベースはテーブル全体をスキャンするのではなく、インデックスを参照することで目的の行を迅速に見つけることができます。
これは、インデックスがツリー構造(B-Treeなど)を使用しており、データの検索をログ時間で行えるためです。



インデックスの使用方法

インデックスの使用方法は、対象のカラムに対してインデックスを追加します。
具体的に、以下の例で使用方法を見てみましょう。

employeesテーブルに、id, name, departmentカラムを持つ100万行のデータの中で
department='Sales'のデータを取得したい場合で考えてみましょう。

				
					sql
-- インデックスを使用しない場合の検索
EXPLAIN ANALYZE SELECT * FROM employees WHERE department = 'Sales';

--結果
Seq Scan on employees  (cost=0.00..14435.00 rows=500000 width=24) (actual time=0.060..300.305 rows=500000 loops=1)

				
			
				
					sql
--インデックスを作成する
CREATE INDEX idx_department ON employees(department);


				
			


				
					sql
--インデックスを使用する場合の検索
EXPLAIN ANALYZE SELECT * FROM employees WHERE department = 'Sales';

--結果
Bitmap Heap Scan on employees  (cost=3612.86..12812.86 rows=500000 width=24) (actual time=22.500..83.856 rows=500000 loops=1)

				
			

上記の例では、インデックスありの場合、検索時間が300ミリ秒から83ミリ秒に短縮されました。



インデックスを有効活用するには

インデックスは適切に使用することで処理時間の高速化を図ることができますが、インデックスを有効活用するためには適切なカラムに対して作成することが重要です。
どのようなカラムに対してインデックスを作成すべきかの基準となるのが、列のカーディナリティが高いこと(値がよくばらついていること)と選択率が低いこと(少ない行に絞り込めるということ)です。
具体的な数値としては、だいたい5%未満に絞り込める条件ならば、そのカラムに対してインデックスを作成することで処理速度の向上が見込める可能性が高いです。
※DBMSやストレージ性能の条件によって異なります。


参考文献

ミック「SQL実践入門 高速でわかりやすいクエリの書き方」


最後に

今回は、SQLの処理速度を向上させる手段の一つである「インデックス」について解説しました。
最後までお読みいただきありがとうございました!


スーパーソフトウエアの採用情報

あなたが活躍できるフィールドと充実した育成環境があります

blank
blank