3

10列のテーブルがあります。次に、ユーザーが任意の列でデータを並べ替えるオプションをユーザーに提供したいと思います。たとえば、7つのアイテムを含むコンボボックスで、それぞれがテーブルの列であるとします。ここで、ユーザーは1つのアイテムを選択し、選択した列で並べ替えられたデータを取得します。

今、問題は何ですか?

私のテーブルには3Mのレコードがあり、インデックス付きの列でデータを並べ替えても問題はありませんが、インデックスなしの列では並べ替えに3.5分かかります!!!

私が考えている解決策は何ですか?

並べ替える必要があるテーブルのすべての列にインデックスを追加します。私の場合、8列のインデックスがあります!!!!

私の解決策の問題は何ですか?

列に多くのインデックスがあると、INSERT/UPDATEクエリの速度が低下する可能性があります。私の場合、テーブルは頻繁に更新されます(毎秒!!!!!)

この場合のあなたの解決策は何ですか?!

4

2 に答える 2

0

オプション #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をしばらく使用していて非常に満足していますが、弾性検索についても良いと聞きました.

于 2012-10-02T10:38:04.350 に答える