オプション #1 : MySQL に制限されている場合、より良いオプションはありませんが、可能な順序列に対して 8 つのインデックスを作成します。挿入/更新は確かに苦しむことになりますが、実際の訪問者はリストがソートされるまで3.5分待つことはありません.
チューン #1: 少し速くするために、標準インデックスの代わりに部分インデックスを作成すると、使用するスペースが大幅に少なくなり (これらの列の一部は varchar であると仮定します)、これは書き込みが少なくなり、メモリのフットプリントが小さくなることを意味します。部分文字列を使用して各列のエントロピーをチェックし、90% 以上の差があることを確認するだけです。
たとえば、次のようなクエリを使用します。
> select count(distinct(substring(COLUMN, 1, 5))) as part_5, count(distinct(substring(COLUMN, 1, 10))) as part_10, count(distinct(substring(COLUMN, 1, 20))) as part_20, count(distinct(COLUMN)) as sum from TABLE;
+--------+---------+---------+---------+
| part_5 | part_10 | part_20 | sum |
+--------+---------+---------+---------+
| 892183 | 1996053 | 1996058 | 1996058 |
+--------+---------+---------+---------+
Tune #2: バックグラウンドで実行するステートメントを挿入/更新できます。アプリケーションは速くなりませんが、ユーザー エクスペリエンスは大幅に向上します。
調整 #3: 挿入/更新のために、可能であればより大きなトランザクションを使用します。
オプション #2 : この使用パターン用に構築された検索エンジンの 1 つを使用してみることができます (これも)。私はSolrをお勧めしますが、私はSolrをしばらく使用していて非常に満足していますが、弾性検索についても良いと聞きました.