3

私の場合、クエリ期間に最適な日時形式をテストするだけです。これが私のクエリです:

   SELECT 
    max(ColumnA), -- bigint
    CreateDate, 
    ColumnB, 
    EndTime, 
    ColumnC, 
    ColumnD, 
    ColumnE, 
    ColumnF, -- int
    StartTime, -- timestamp or datetime or int - UNIX_TIMESTAMP(StartTime)
    ColumnG, 
    ColumnH, 
    ColumnI, 
    ColumnJ, 
    UpdateDate, 
    ColumnK FROM TABLE

条件:

-- with indexes
  (Iteration 1) WHERE StartTime BETWEEN "2013-01-18 16:50:00" AND "2013-10-18 18:05:00" AND ColumnF in(5428) GROUP BY ColumnF,StartTime
  (Iteration 2) WHERE StartTime BETWEEN "2013-05-18 11:00:00" AND "2013-06-23 22:05:00" AND ColumnF in(5428) GROUP BY ColumnF,StartTime
  (Iteration 3) WHERE StartTime BETWEEN "2013-08-18 11:00:00" AND "2013-08-23 22:05:00" AND ColumnF in(7752) GROUP BY ColumnF,StartTime
  (Iteration 4) WHERE StartTime BETWEEN "2013-01-18 16:50:00" AND "2013-10-18 18:05:00" AND ColumnF in(5428,5675,444) GROUP BY ColumnF,StartTime
  (Iteration 5) WHERE StartTime BETWEEN "2013-09-01 16:50:00" AND "2013-09-15 18:05:00" AND ColumnF in(5428,5675,444) GROUP BY ColumnF,StartTime
-- and same without indexes

テスト情報:

Count = 400K
Engine version = 5.6.10
DBEngine = InnoDB
Tests procedure - MySQL restart before any query.

結果:

With index on StartTime, with index on ColumnF                      

    Iteration   1      2       3       4       5
timestamp   0.094   0.094   0.124   0.124   0.125
datetime    0.125   0.109   0.141   0.156   0.156
int         0.125   0.124   0.094   0.156   0.156
Rows            38     8       1       128  8

Without index on StartTime, with index on ColumnF                   
    Iteration   1      2       3       4      5
timestamp   0.078   0.062   0.062   0.109   0.125
datetime    0.078   0.078   0.078   0.140   0.125
int         0.078   0.078   0.078   0.140   0.125
Rows            38     8       1       128      8

そこで、インデックスなしでタイムスタンプを使用することにしました (ただし、インデックスがないと結果は非常に似ています)。

編集: クエリを 1 つだけ使用することにした理由がよくわかりません。怠惰かもしれませんし、日曜日に働くべきではないかもしれません:) テストは無関係であり、結論は誤りです。テストを作成するときに、すべてのテスト情報を書き直します...通常:)

EDIT2:修正

4

1 に答える 1

2

ある日、Timestamp ではなく Datetime を選択した時期について質問しました。私が思うのは、整数のタイムスタンプでは多くの時間を稼げないということです。 また、とは MySQL のエイリアスであることを覚えておいてTIMESTAMPDATETIMEください。PostgreSQL を使用する場合はTIMESTAMP. ここで、あなたのテストは無関係のようです。

EDIT : それらは同等ではありません。同じようにフォーマットされているだけです。実際のTimestampところ、タイムゾーンに依存しないタイプです。この問題を取り除くことができます。ただし、カスタマイズが少なくなり、1970 年から 2038 年までに制限されます。他の日付を保存する必要がある場合 (それ以前またはそれ以降)、失敗します。

2つのことが私にそれを言わせます:

  • 2回の繰り返し
  • 分散メトリックなし
  • テストしているすべてのものにほとんど違いはありません

INTとの大きな違いTIMESTAMPは、メモリ内の場所です。あなたはそれをテストしません.そして、観測された期間は本当に短いです.

私は整数よりもDateTimeを完全に支持していると思います。

于 2013-02-17T13:12:25.070 に答える