5

次のクエリを頻繁に使用します。

SELECT * FROM table WHERE Timestamp > [SomeTime] AND Timestamp < [SomeOtherTime] and publish = 1 and type = 2 order by Timestamp

このクエリを最適化したいのですが、タイムスタンプをクラスター化インデックスの主キーの一部として配置することを考えています。これによりクエリが大幅に改善されますが、これが役立つかどうかはわかりません。

table has 3-4 million+ rows.
timestamp field never changed.
I use mysql 5.6.11

Anothet ポイントは次のとおりです。これが私のクエリを改善する場合、timestamp(mysql 5.6 では 4 バイト) または datetime(mysql 5.6 では 5 バイト) を使用することをお勧めします。

4

2 に答える 2

6

1) タイムスタンプの値が一意である場合は、それを主キーにすることができます。そうでない場合は、「where」で頻繁に使用するため、timestamp 列にインデックスを作成します。

2) BETWEEN 句を使用すると、ここではより自然に見えます。HASH ではなく、TREE インデックス (デフォルトのインデックス タイプ) を使用することをお勧めします。

3) タイムスタンプ列にインデックスが付けられている場合、order by を呼び出す必要はありません。既にソートされています。(もちろん、インデックスが HASH ではなく TREE の場合)。

4) 整数の unix_timestamp は、メモリ使用量とパフォーマンスの両方の面で datetime よりも優れています。日付の比較は、整数の比較よりも複雑な操作です。

インデックス付きフィールドでデータを検索するには、O(log(rows)) ツリー ルックアップが必要です。整数の比較は O(1) で、日付の比較は O(date_string_length) です。したがって、違いは (ツリー検索の数) * (difference_comparison) = O(date_string_length)/O(1))* O(log(rows)) = O(date_string_length)* O(log(rows)) です。

于 2013-05-31T08:23:45.413 に答える