2

これが私の状況です。合計 13,3 GB のデータを持つ約 400 万のレコードを含む MySQL MyISAM テーブルがあります。このテーブルには、外部システムから受信したメッセージが含まれています。テーブル内の 2 つの列は、メッセージが処理されたかどうかに関係なく、タイムスタンプとブール値を追跡します。

このクエリを使用する場合:

SELECT MIN(timestampCB) FROM webshop_cb_onx_message

結果はほぼ瞬時に表示されます。

ただし、次のように、未処理のメッセージの最も古いタイムスタンプを見つける必要があります。

SELECT MIN(timestampCB ) FROM webshop_cb_onx_message WHERE handled = 0

このクエリの結果は約 3 分後に表示されますが、これは私が書いているスクリプトには遅すぎます。

両方の列は、まとめてではなく、個別に索引付けされます。ただし、テーブルにインデックスを追加するには、既にそこにあるデータの量を考慮すると、信じられないほど時間がかかります。

私の問題は、両方の列が別々にインデックス化されているという事実に起因していますか?もしそうなら、別のインデックスを追加する以外に私の問題を解決できる人はいますか?

4

1 に答える 1

2

インデックスの選択性が 20% を超える場合は、インデックス アクセスよりもフル テーブル スキャンを使用することをお勧めします。これは、処理されたインデックスが実際にはインデックスを使用するのではなく、選択性を考慮して完全なテーブル スキャンになる可能性が高いことを意味します。

の複合インデックスはhandled, timestampCB、選択性が高くなくても、複合インデックスを使用するとパフォーマンスが実際に向上する可能性があります

于 2013-03-19T20:49:26.877 に答える