4

今朝から自問自答している質問を Google で検索しましたが、それに関する情報や記事は見つかりませんでした。

次の状況で、パフォーマンスを改善することを考えていました(まだ少し%):

コンテキスト: 2 つの列があります : ID, AddedAt(AddedAt行が作成されたときの Unix タイムスタンプです)。

理論的には、新しい行を挿入するIDと +1AddedAtになり、現在の時刻になります。

さて、現在の状況では 2 つの同時挿入が不可能であるとしAddedAtましょPKIDAddedAtと を行う唯一のユニークな列にPKなりUNIX Timestampます。したがって、最終的には、2 列ではなく 1 列になります。

AddedAt私が見る唯一の悪い面は、今日のUNIXタイムスタンプが10桁であるため、作成されるキーのサイズです。

この状況で、それは良いでしょうか?あなたの意見は何ですか ?

編集: タイムスタンプ + ms の使用はどうですか?

4

5 に答える 5

4

タイムスタンプは秒単位です。同時挿入はないかもしれませんが、世界が高速化する傾向にあるため、1 秒間に複数の挿入が発生する可能性があります。正常に機能するようにシステムを構築します。タイムサンプルを主キーとして使用しないでください。

また、ステートメントのレプリケーションでは、データベース間でタイムスタンプが一貫していないことがあります... 行ベースのレプリケーションはこれを軽減しますが、それらを使用する際の別の懸念事項です。

良い慣例の観点から、主キーは、単純な古い自動インクリメント id フィールド以外の何かである場合、外部の他の人にとって明確な意味を持っている必要があります。一般に、人々はキーに数値や char 値を期待し、blob、タイムスタンプ、日時などではありません。これは、後で別のテーブルの外部キーとして使用される場合に特に当てはまります。タイムスタンプを外部キーとして使用すると、混乱を招く可能性があります。後の開発者に。確かに、一意であることがわかっている varchar GUID フィールドがある場合は、それをキーとして使用してください。外部キーとして使用すると、巨大な文字列がある場合、かなりの量のメモリも消費することを覚えておいてください。

于 2012-07-31T14:22:49.833 に答える
2

同じ 1 秒間隔内に 2 つのイベントが発生しないことを保証できると仮定すると、タイムスタンプ フィールドを PK として使用できます。

そうは言っても、なぜキーのサイズが心配なのですか? タイムスタンプは 10 桁の場合がありますが、その内部ストレージ要件は4 バイトのみです。比較すると、int も 4 バイトであるため、bigint を使用していない限り (その場合は 8 バイト)、何も失うことはありません。

また、タイムスタンプ フィールドは y2038k 問題の影響を受けることに注意してください。それらは基本的に、人間が読める日付に自動フォーマットする UNIX タイムスタンプです。アプリが 26 年以上存在する場合は、固定の日付/時刻ではなく、「行を挿入する速度」のラップアラウンド範囲を持つ int/bigint を使用する必要があります。

于 2012-07-31T14:21:43.367 に答える
1

主キーは技術的なものであるだけでなく、行によって表される各オブジェクトを一意にする何かのビジネス表現です。

(あなたのケースでは) 2 つのオブジェクトを同時に挿入することはできないため、タイムスタンプはオブジェクトの一意のフィールドですが、ビジネス オブジェクトの主要な定義ではありません (「タイムスタンプ」と呼ばれるビジネス オブジェクトがある場合は、はい、挿入された時刻が主キーである必要があります)

ID は「私のクライアントは彼を表す物理的な ID を持っています」の略です。以前は、書類や請求書でクライアントに番号を付けていました...

コンピュータ サイエンスはそれ自体が目的ではなく、目標を達成するための手段であることを決して忘れないでください。

于 2012-07-31T14:29:03.777 に答える
0

IDUNIXタイムスタンプが予期しない値を与えるシナリオがある可能性があるため、列を主キーのままにします。1 つは連続して非常に高速に挿入すると同じタイムスタンプが返される可能性があり、もう 1 つはサーバー管理者がサーバーの時刻設定を変更することにした場合です。

通常、主キーはタイムスタンプではなく、ある種の一意の ID であると予想されるため、結合を行うことはおそらくはるかに明白です。

于 2012-07-31T14:21:51.507 に答える
0

はい、もちろんですが、パフォーマンスの向上は、新しいレコードを追加している間だけ最小限に抑えられます。さらに、関連するすべてのオブジェクトでforeign_keysにタイムスタンプを使用する必要があります。

1 秒あたりの挿入数と多くのレコードが予想される場合 (id 列とそのインデックスのストレージを節約するため) にのみ検討する価値がありますが、あなたが言ったように、タイムスタンプは一意になるため、1 秒あたり最大 1 レコードです :-)

于 2012-07-31T14:22:04.577 に答える