###知りたいこと
インデックスについて確認させていただきたいことがございます。
仮にインデックスを次のように3つセットした場合ですが、
CREATE TABLE search_cache ( ID INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, service_id TINYINT(1) UNSIGNED NOT NULL, q VARCHAR(100), color VARCHAR(10), updated_at DATETIME(6) NOT NULL, PRIMARY KEY (ID), # インデックスをセット INDEX idx_search_cache_01(service_id), INDEX idx_search_cache_02(q), INDEX idx_search_cache_03(color) );
この場合、次のSELECT
でインデックスは効かないのではないでしょうか?
sql
1SELECT * 2FROM cache_datas 3WHERE service_id=1 AND q='りんご いちご' AND color='red'
###なぜこう考えたのか
インデックスは
idx_search_cache_01
(service_id
が対象カラム)
idx_search_cache_02
(q
が対象カラム )
idx_search_cache_03
(color
が対象カラム)
という3つでセットしています。
WHERE
の最初にservice_id
を指定した場合、その時点でまず、検索対象データはidx_search_cache_01
となりますよね。
このidx_search_cache_01
に対しさらにAND q='りんご いちご'
と指定していますが、idx_search_cache_01
のインデックスの中にはq
に対するインデックスはありませんから、idx_search_cache_01
の中ではq
の並び順は不明瞭ですよね。
そうであれば、q
に対してセットしたidx_search_cache_02
は、上記SELECT
のように
一番目にidx_search_cache_01
を指定したSELECT
(つまり一番目にWHERE service_id=1
と指定したSELECT
)
では効かないのではないかと考えたのですが…
###対策
上記の考え方があっていれば、ひょっとして、複合インデックスというのはこのための機能なのでしょうか?
つまりインデックスは3つでなく次のように1つに複合して、
INDEX idx_search_cache_01(service_id,q,color)
こうすることではじめて、上記SELECT
でもインデックスが効くという仕組みですか?
###さらなる疑問
上記の考え方と対策が正しい場合ですが、そうすると検索のパターンが複数ある場合、そのパターンだけ複合インデックスを貼るということになるのでしょうか?
たとえばSELECT
したいパターンとして次の【A】と【B】2つがあった場合
sql
1# パターン【A】 2SELECT * 3FROM search_cache 4WHERE service_id=1 AND q='りんご いちご' AND color='red' 5 6# パターン【B】 7SELECT * 8FROM search_cache 9WHERE service_id=1 AND color='red'
この場合は複合インデックスも次のように貼るということになるのでしょうか?
【A】のためのインデックス → INDEX idx_search_cache_01(service_id,q,color)
【B】のためのインデックス → INDEX idx_search_cache_02(service_id,color)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/01 05:28
2020/07/01 05:52
2020/07/01 06:51
2020/07/01 07:25
2020/07/01 08:02
2020/07/01 08:10 編集
2020/07/01 09:39
2020/07/01 13:20 編集