2016-08-15 4 views
1

この問題は、BIGINT IDや分数のタイムスタンプなどの適切な設計によって完全に回避できますが、それは私の能力を超えています。MySQLで整数オーバフローを処理する場合

マシンは、整数IDと秒精度のタイムスタンプを使用して、MySQLデータベースにデータを送ります。それに応じてIDが増加し、すなわち1から91から181などのデータが90msごとに供給されている。このインクリメントは毎秒数回起こるので、同じタイムスタンプを有する異なるIDがある。また、IDフィールドは唯一の符号なしSMALLINTであるので、それは私が時間順のデータが必要です65536

に達するオーバーフローがあるので、簡単な

ORDER BY timestamp ASC, ID ASC 

は、以下のような場合のために働くだろうタイムスタンプによってカバーされる第2の範囲内にはオーバーフローは存在しない。残念ながら、オーバーフロー、42、132および222は、65308前にソートなるだろうIDを提示65398および65488.

で何とかmin()をどの範囲に指定して

ORDER BY 
    timestamp ASC, 
    If((min(ID)<10000) and (max(ID)>60000), If(ID<10000, ID+65536, ID), ID) 

ような何かをする方法はありますmax()が適用されますか?

EDIT 1:データはそうauto_incrementカラム必ずしも正しい時間的順序を反映しないであろう(私はさえ冗長かかわらず、レコードを分離するために)、バッチで添加されます。

EDIT 2:上部のイタリック体の行を参照してください。

+0

別の自動インクリメントID列をテーブルに追加し、注文用に使用できますか? – PaulF

+0

Paulと私はID列がAUTO_INCREMENTだとします...だがそれは?それとも、「マシン」が増えて、それを制御できないのですか? 純粋なMySQLに残っていると、カウンタはオーバーフローしますが、古いデータをパージするかREPLACEする必要があります。そうしないと、重複したキー入力エラーが発生します。これについてもう少し詳しく説明できますか? – YetiCGN

+0

@ YetiCGN - テーブルの自動インクリメントとして定義された別のID列を提案していたので、マシン生成IDが自動インクリメントかラップアラウンドするかどうかは関係ありません。 – PaulF

答えて

0

データベースデザインのどれくらいの権限がありますか?明らかに、主キーフィールドの幅を変更することはできません。タイムスタンプ列の精度を変更できる場合は、fractions of a secondを含めることができます。

もう1つの方法は、timed SQL文をデータベースに発行して、オーバーフローが発生しないようにAUTO_INCREMENTカウンタをn秒ごとにリセットすることです。以内にのタイムスタンプ間隔を設定します。しかし、これは明らかに90ミリ秒の精度に調整する必要があります。

他のすべてが失敗した場合は、トリガーの助けを借りて別のテーブルにデータをコピーし、順序基準を計算します。これは、純粋なSQLでは遅くなる可能性がありますが、簡単なスクリプトがこのトリックを行う可能性があります。

編集:私はすぐにあなたのスキーマを再作成し、重複領域にのみ存在することができることを、あなたが作った同じ仮定して、クエリのこの獣を思い付くためにいくつかのテストデータとそれを埋めてきた 10,000〜60,000:

SELECT *, (SELECT IF(COUNT(*) > 0, 1, 0) FROM test t WHERE t.timestamp = test.timestamp AND t.id NOT BETWEEN 10000 AND 60000) AS has_overlap FROM test ORDER BY timestamp ASC, IF(has_overlap AND id < 10000, id + 65536, id)

サブクエリはあなたを殺す可能性があるため、今、あなたはただ、パフォーマンスのためにそれをテストする必要があります。その場合は、順序付けされたSELECTクエリを作成する前に事前に計算してください。

+0

データベースに書き込まれるデータに影響を与えることはありません。私ができることは、データを抽出して操作するためにSQLコード(またはさらに下流のもの)を書くことだけです。 – Raketenolli

+0

しかし、あなたの最初の文章では、「その一部は私の能力を超えている」と述べており、その一部(データベース設計)があなたの能力の範囲内にあることを暗示しています。どのくらい正確には? :-) – YetiCGN

関連する問題