MySQL複合インデックス順番のメモ
複合インデックス
複合インデックスを登録するときは、順番が重要になる。
2つの複合インデックスの場合、順番が逆になることで意味がなくなります。
id | datetime | flag
----+---------------------+------
1 | 2021-04-01 00:00:00 | 0
2 | 2021-02-01 00:00:00 | 1
3 | 2021-01-01 00:00:00 | 0
4 | 2021-03-01 00:00:00 | 0
5 | 2021-02-01 00:00:00 | 0
6 | 2021-05-01 00:00:00 | 1
7 | 2021-04-01 00:00:00 | 1
8 | 2021-02-01 00:00:00 | 1
9 | 2021-01-01 00:00:00 | 0
10 | 2021-03-01 00:00:00 | 1
上記のようなテーブルで(datetime, flag)の順に複合インデックスを登録した場合、以下のようなイメージになると思います。
これでは、datetimeとflagを使った検索には有効でなさそうです。
id | datetime | flag
----+---------------------+------
3 | 2021-01-01 00:00:00 | 0
9 | 2021-01-01 00:00:00 | 0
5 | 2021-02-01 00:00:00 | 0
2 | 2021-02-01 00:00:00 | 1
8 | 2021-02-01 00:00:00 | 1
4 | 2021-03-01 00:00:00 | 0
10 | 2021-03-01 00:00:00 | 1
1 | 2021-04-01 00:00:00 | 0
7 | 2021-04-01 00:00:00 | 1
6 | 2021-05-01 00:00:00 | 1
(flag, datetime)の順の場合は、以下のようなイメージになると思います。
これだと綺麗で検索に有効そうです。
id | datetime | flag
----+---------------------+------
3 | 2021-01-01 00:00:00 | 0
9 | 2021-01-01 00:00:00 | 0
5 | 2021-02-01 00:00:00 | 0
4 | 2021-03-01 00:00:00 | 0
1 | 2021-04-01 00:00:00 | 0
2 | 2021-02-01 00:00:00 | 1
8 | 2021-02-01 00:00:00 | 1
10 | 2021-03-01 00:00:00 | 1
7 | 2021-04-01 00:00:00 | 1
6 | 2021-05-01 00:00:00 | 1
登録の際は順番が重要ですが、検索等を行うときのwhere句内の要素の順番は複合インデックスの登録順と一致していなくても大丈夫。