-1

テーブルを作成し、いくつかのイベントのキャッシュされたステータスをそこに保存する必要があります。したがって、次の 2 つの操作のみを実行する必要があります。

1) イベントの ID、ステータス、およびこのレコードがデータベースに保存された時刻を挿入します。

2) 特定のイベント ID を持つ最後のレコードを取得します。

結果 (ステータス) を取得するには、いくつかの方法があります。

方法 1:

SELECT status FROM status_log a
WHERE a.event_id = 1
ORDER BY a.update_date DESC
LIMIT 1

方法 2:

SELECT status FROM status_log a
WHERE a.update_date = (
  SELECT max(b.update_date) FROM status_log b
  WHERE b.event_id = 1
)  AND a.event_id = 1

だから私は2つの質問があります:

  1. 使用するクエリ
  2. update_date フィールドに設定するフィールド タイプ (int またはタイムスタンプ)
4

2 に答える 2

1

使用するクエリ

最初の方が速いと思います。とにかくEXPLAINそれらを実行するだけで、自分で見つけることができます。

使用するインデックスは次のとおりです。

ALERT TABLE status_log ADD INDEX(event_id, update_date)

さて...これらのクエリが同等ではないことに気付きましたか? 2 つ目は、最大の日付を持つすべての event_id からすべてのステータスを返します。

update_date フィールドに設定するフィールド タイプ (int またはタイムスタンプ)

という名前のフィールドがある場合、同じ目的を果たすupdate_date理由が想像できません。または のどちらかintを選択するように質問を言い換えると、答えは要件次第です。DB 内のレコードがいつ更新されたかを知りたい場合は、タイムスタンプを使用します。がドメイン モデル内のエンティティを参照している場合は、 . ほとんどの場合、日付の計算 (時刻の追加、時刻の削除、月の抽出など) を実行する必要があるため、UNIX タイムスタンプを使用すると (ほとんど書き込み専用になるはずです)、余分な計算時間が発生します。 ' を に変換してから、その結果に対して関数を実行する必要があります。datetimetimestampupdate_datedatetimetimestampdatetime

于 2013-10-10T14:41:28.120 に答える