条件によってインデックスを使い分け、より素早く目的のデータを検索できるようにするためです。
前提としてインデックスってのは「目次」のことで、大量にあるデータから目当てのものを素早く探すために用意されるものです。
インデックスを設定することで、本体のデータとは別に、データを探しやすくするための目次が別に作成されるようになります。
参考書でいうと本文がデータベース自体で、巻末についている索引がインデックスですね。
複数のカラムを指定してインデックスを作成するときは、その順番によって作成される目次が変わってきます。
こんなテーブルから目的のidを見つけたいとしたら
id | user_id | event_id |
---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
4 | 2 | 1 |
5 | 2 | 2 |
6 | 2 | 3 |
1. [:user_id, :event_id] によって作られる目次
= user_id: 1
- event_id: 1 ... 1
- event_id: 2 ... 2
- event_id: 3 ... 3
= user_id: 2
- event_id: 1 ... 4
- event_id: 2 ... 5
- event_id: 3 ... 6
user_idを基準に目次が作られるので、user_idを元に検索する時に見つけやすい
ex. select * from table where user_id = 2;
ex. select id from table where user_id = 2 order by event_id;
2. [:event_id, :user_id] によって作られる目次
= event_id: 1
- user_id: 1 ... 1
- user_id: 2 ... 4
= event_id: 2
- user_id: 1 ... 2
- user_id: 2 ... 5
= event_id: 3
- user_id: 1 ... 3
- user_id: 2 ... 6
event_idを基準に目次が作られるので、event_idを元に検索する時に見つけやすい
ex. select * from table where event_id = 3;
ex. select id from table where event_id = 2 order by user_id;
みたいな感じで、将来的にどういう検索が多くされるのか、時間がかかるのか、といったことを考えてインデックスを準備する必要があるという話ですね。
ちなみに2つのカラムで検索を行った場合
ex. select * from table where user_id = 2 and event_id = 3;
は、
先に登録されたインデックス(この場合はuser_id基準のもの)が使われるはずです(これに関してはうろ覚えで自信ないです)
「複合インデックス」で調べてみると詳しくわかるかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/13 10:28