###知りたいこと
インデックスについて確認させていただきたいことがございます。
仮にインデックスを次のように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 編集