11

2 つの日付間のデータを検索する最も効率的な (そして最速の) 方法は何ですか?

次の簡単なクエリがあるとします。

SELECT Date_,counter1,counter2,...
WHERE (date range condition)

「Date_」列は DATETIME 型です。

次のようなさまざまなオプションを試しました:

WHERE Date_ >= '2012-12-01 00:00:00' AND Date_ <= '2012-12-05 00:00:00'

WHERE Date_ BETWEEN '2012-12-01 00:00:00' AND '2012-12-05 00:00:00'

WHERE Date_ = '2012-12-01 00:00:00' OR Date_ = '2012-12-02 00:00:00' OR
Date_ = '2012-12-03 00:00:00' OR Date_ = '2012-12-04 00:00:00' OR
Date_ = '2012-12-05 00:00:00'

実際、この Select クエリはもっと​​複雑です (結合と条件が追加されています)。これは単純化されたバージョンのみです。EXPLAIN によると、クエリの実行方法に違いはありません。Date_ 列にはインデックスが付けられていると言う必要があります。残念ながら、OS キャッシュを回避できないため、実際のクエリ速度をテストすることはできませんが、少なくとも MySQL キャッシュは使用されませんでした (SQL_NO_CACHE)。

あなたの経験によると、(関数なしで) 日付間隔で検索するより高速な方法はありますか?

3 つの方法のうち、どちらが高速ですか (違いがある場合)?

よろしくお願いします!

4

1 に答える 1

10

効率の大きな要因は、適切なインデックスの可用性と効率的な実行計画の生成です。

日時範囲を検索するための標準的なパターンは、より大きいと等しい、およびより小さい(ただし等しくない)比較を使用することです。

たとえば、「2012-12-01」のように、1日のすべての日時を取得するには、通常、次のようにコーディングします。

WHERE datetimecol >= '2012-12-01'
  AND datetimecol <  '2012-12-02'

-また-

WHERE datetimecol >= '2012-12-01'
  AND datetimecol <  '2012-12-01' + INTERVAL 1 DAY

同様に、例で5日間の範囲を取得するには、次のようにします。

WHERE datetimecol >= '2012-12-01'
  AND datetimecol <  '2012-12-06'

-また-

WHERE datetimecol >= '2012-12-01'
  AND datetimecol <  '2012-12-01' + INTERVAL 5 DAY

あなたの質問に答えるために、「より速い方法はありますか?」いいえ。その形式の述語により、MySQLはインデックスに対して範囲スキャンを実行できます(適切なインデックスが利用可能である場合)。それ以上の効率は得られません。

于 2013-01-24T16:02:23.487 に答える