質問: 0 AND created_at >= '2020-01-01 00:00:00' [SELECT...] WHERE created_at BETWEEN '2020-01-01 00:00:00' AND '2020-12-31 23:59:59' ORDER BY created_at DESC ``` ### 実現したいこと 上記を踏まえ、まず最初の画面初期表示時に発行されるクエリの為に、"created_at"カラムにインデックスが必要だとは思うのですが、 それ以外のカラムについては"発行されるクエリ例"のようにクエリのパターンが多く、どのようにすべきか悩んでいます。 あらゆるパターンを考慮して複合インデックス含め作成しておくべきでしょうか。 なお、現状のレコード数は1000件にも満たないので、インデックスの有効性は無いと思っていますが、 一切レコードを物理削除することなく運用を続けていき、いずれチューニングを無視できないレコード数になった場合を想定して検討中です。 ### 補足情報 MySQL 5.7
回答: > > [SELECT...] WEHER event_id = 1 AND status = 0 AND created_at >= '2020-01-01 00:00:00' > > > event_id, status, created_at でインデックスを1つ。 > > [SELECT...] WEHER created_at BETWEEN '2020-01-01 00:00:00' AND '2020-12-31 23:59:59' ORDER BY created_at DESC > > > created_at でインデックスを1つ。 > > それ以外のカラムについてはクエリのパターンが多く、 > > > そのパターンも質問に追記しては? めったにSELECTされない条件ならインデックスは作らないとか。 MySQL SQL実行計画の疑問解決には「とりあえずEXPLAIN」しよう を確認したり、処理時間を実測してインデックスを設定します。