質問: mysql5.7で部分インデックスは使えますか?IN句をもちいて、処理中、保留中、待機中のフラグカラムを持ったテーブルを条件つきで参照するインデックスが使いたいです。 また、厳密にインデックスにおいて速度を追求するアプリを作る必要がある場合、mysqlで現在でも非対応なのであれば、postgresを使うべきでしょうか? それとも、現実的にそこまでのチューニングは商用サイトにおいてする必要がないと思っていいのでしょうか?(実際yahooやgoogleなんかもmysqlで動いてるわけですし)
回答: > > mysql5.7で部分インデックスは使えますか? > > > まず、2018年の時点ではMySQLはどのバージョンでも部分インデックスをサポートしていないようです * sql - Does MySQL support partial indexes? - Stack Overflow ただし、MySQLはバージョン8以降でインデックスにCASE句を含められるようになっているので、これを使えば部分インデックスと同様の効果が得られるかもしれません * indexing - Workaround in mysql for partial Index or filtered Index? - Stack Overflow > > また、厳密にインデックスにおいて速度を追求するアプリを作る必要がある場合、mysqlで現在でも非対応なのであれば、postgresを使うべきでしょうか? > > > 速度が欲しい場合は部分インデックスでも通常のインデックスでもそこまで差は出ないはずです。ただし通常のインデックスの方がデータ容量は大きくなります。 > > 処理中、保留中、待機中(フラグ)の区分しかないカラムであれば、インデックスはほとんど意味がありません。 > > > この辺りちょっと補足の必要がありそうなので書きます > > 処理中、保留中、待機中のフラグカラムを持ったテーブルを条件つきで参照するインデックスが使いたいです。 > > > `処理済み` を意味するフラグは不要なのでしょうか もし処理済みのレコードが残るようなテーブル設計ならば、部分インデックスでなくても普通のインデックスをはることが有効です。なぜならそのテーブルを何年も運用すると履歴が積み重なり、そのテーブルは `処理済み` にレコードが大多数になるはずだからです。 仮に99%のレコードが `処理済み` で、その他のステータスになっているレコードが1%しかないのなら、インデックスを使えばMySQLが調べるレコードは100分の1で済むようになります もちろん部分インデックスと比べると通常のインデックスはディスク容量を食いますが、メリットのほうが大きいはずです