37565


下記entriesテーブルにインデックスをどのように貼るのが良いのか困っております。

### entriesテーブル

[code]

    id # シーケンス、PK
    language # 言語, jaとかenとかはいる
    title # タイトル
    description # 説明文
    
[/code]

### SQLのためのインプット

  * word = 検索言語1
  * language = ‘ja’

### SQL

[code]

    select * from entries
    where language = “ja”
    and (title like “%{word}%” or description like “%{word}%”)
    
[/code]

### 困ってること

インデックスをどう貼るのがよいか?  
下のように２つインデックスを貼っても、1SQLのこのテーブルに対しては1つしかインデックスが使われないので、おそらくindex1かindex2が使われることになるかと。  
でも、titleにたいしても、descriptionにたいしてもインデックスを使われるようにしたいです。

[code]

    index1 (language, title)
    index2 (language, description)
    
[/code]

### 拡張

  * 今は検索単語1だけですが、検索単語を２つ入れた場合、  
検索単語1と検索単語2でのAND検索になるようにしたいです。その場合にインデックスどうはるかもちょっといいアイデアがないです。

  * Railsで実装していて、kaminariというページング用のgemを使っています。できればこのgemを使ったページングを行いたいです。。ということはSQLは1個にする必要がありそう。


CC BY-SA 3.0
2017-08-29T04:51:47.310
37557
2017-08-29T08:00:32.810
25065
question
ruby-on-rails mysql
OR検索が絡む時のMySQLでの複合インデックスのはりかた


そもそもLIKEによる部分一致検索にはインデックスは使えません。(前方一致検索であればインデックスがつかえる可能性があります。)

パフォーマンス上問題があるのであれば、全文検索エンジンの導入を検討してください。DBに寄って異なるので、「MySQL 全文検索」とか「PostgreSQL
全文検索」とかで調べてみてください。


CC BY-SA 3.0
2017-08-29T08:00:32.810
37565
2017-08-29T08:00:32.810
5793
37557
answer